void ScriptWidget::onSaveButtonClick()
{
QFile updateScriptFile("update-script");
if (!updateScriptFile.open(QFile::WriteOnly | QFile::Text)) {
QMessageBox::critical(this, tr("I/O Error"), tr("Error opening file %1\n"
"Error: %2")
.arg(updateScriptFile.fileName())
.arg(updateScriptFile.errorString()));
return;
}
QTextStream out(&updateScriptFile);
out << ui->textEdit->toPlainText(); // Get text from the QTextEdit Widget
updateScriptFile.close();
emit signalSendMessageToStatusBar(QString(tr("File Saved.")));
}
Я так записываю, вроде все работает.
Используй документацию и Assistant.
1. Бланшет, Саммерфилд - Qt4 Программирование GUI на С++. 2ed. - 2008
2. Шлее Макс - Профессиональное программирование на C++. +CD. Qt 4.8. (В подлиннике) - 2012
3. Марк Саммерфилд - Qt Профессиональное программирование (High tech) - 2011
4. Андрей Боровский - Qt4.7+. Практическое программирование на C++ - 2012
5. Юрий Земсков - Qt4 на примерах
Первая книга от создателей Qt, в первых главах рассмотрено создание приложения для работы с таблицами (этакий мини Excel). Так что в прямом смысле за день можно разобраться во всех тонкостях создания подобных приложений.
Вторая книга от известного в Qt-сообществе программиста, очень подробный и толстый справочник по виджетам, их описание и примеры использования. Однозначный Must Have.
Третья книга от одного из программистов, разрабатывающих Qt. В ней рассказано о профессиональной разработке приложений. В чем-то является продолжением первой книги.
Четвертая книга от отечественного программиста, рассмотрены в основном принципы разработки сложных приложений. Отдельный разделы посвящены программированию трехмерной и интерактивной графики, баз данных, многопоточных приложений и созданию собственных виджетов.
Пятая книга на мой взгляд уже устарела. Её вполне заменяет Макс Шлее.
Это все книги по Qt 4.X.X на русском языке, известные мне (не считая редакций). Если кто-то знает ещё, пожалуйста отпишитесь.
По Qt 5 книг пока нету. Мак Шлее сказал, что начнет работу над новой книгой с выхода версии Qt 5.2. Но не стоит забывать, что у Qt документация одна из самых лучших и вполне способна заменить книгу. Поэтому настоятельно рекомендую пользоваться Qt Assistant при возникновении затруднений.
По C++ рекомендую конечно классику:
Прата С. - Язык программирования С++. Лекции и упражнения - 2011
2. Шлее Макс - Профессиональное программирование на C++. +CD. Qt 4.8. (В подлиннике) - 2012
3. Марк Саммерфилд - Qt Профессиональное программирование (High tech) - 2011
4. Андрей Боровский - Qt4.7+. Практическое программирование на C++ - 2012
5. Юрий Земсков - Qt4 на примерах
Первая книга от создателей Qt, в первых главах рассмотрено создание приложения для работы с таблицами (этакий мини Excel). Так что в прямом смысле за день можно разобраться во всех тонкостях создания подобных приложений.
Вторая книга от известного в Qt-сообществе программиста, очень подробный и толстый справочник по виджетам, их описание и примеры использования. Однозначный Must Have.
Третья книга от одного из программистов, разрабатывающих Qt. В ней рассказано о профессиональной разработке приложений. В чем-то является продолжением первой книги.
Четвертая книга от отечественного программиста, рассмотрены в основном принципы разработки сложных приложений. Отдельный разделы посвящены программированию трехмерной и интерактивной графики, баз данных, многопоточных приложений и созданию собственных виджетов.
Пятая книга на мой взгляд уже устарела. Её вполне заменяет Макс Шлее.
Это все книги по Qt 4.X.X на русском языке, известные мне (не считая редакций). Если кто-то знает ещё, пожалуйста отпишитесь.
По Qt 5 книг пока нету. Мак Шлее сказал, что начнет работу над новой книгой с выхода версии Qt 5.2. Но не стоит забывать, что у Qt документация одна из самых лучших и вполне способна заменить книгу. Поэтому настоятельно рекомендую пользоваться Qt Assistant при возникновении затруднений.
По C++ рекомендую конечно классику:
Прата С. - Язык программирования С++. Лекции и упражнения - 2011
Может кто-нибудь направить на путь истинный?
Наставляю: воспользуйтесь Qt и забудьте про чудовищный WinApi.
![nm9KbJq.png](http://webcf.waybackmachine.org/web/20140515192534im_/http://habrastorage.org/files/ec5/a8d/034/ec5a8d034d574ea797666af25d1b41a6.png)
Код "main.cpp":
#include <QApplication>
#include <QWidget>
#include <QGridLayout>
#include <QLabel>
#include <QLineEdit>
#include <algorithm>
class Widget : public QWidget
{
Q_OBJECT
public:
Widget() {
gridLayout = new QGridLayout(this);
labelString = new QLabel(tr("String:"));
labelRevertString = new QLabel(tr("Revert string:"));
lineEdit[0] = new QLineEdit();
lineEdit[1] = new QLineEdit();
gridLayout->addWidget(labelString, 0, 0);
gridLayout->addWidget(labelRevertString, 0, 1);
gridLayout->addWidget(lineEdit[0], 1, 0);
gridLayout->addWidget(lineEdit[1], 1, 1);
connect(lineEdit[0], SIGNAL(textEdited(QString)),
this, SLOT(slotTextChanged(QString)));
connect(lineEdit[1], SIGNAL(textEdited(QString)),
this, SLOT(slotTextChanged(QString)));
}
virtual ~Widget() {}
private:
QGridLayout *gridLayout;
QLabel *labelString;
QLabel *labelRevertString;
QLineEdit *lineEdit[2];
private slots:
void slotTextChanged(QString aString) {
std::reverse(aString.begin(), aString.end());
lineEdit[lineEdit[0]->hasFocus()]->setText(aString);
}
};
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget widget;
widget.setFixedSize(widget.sizeHint());
widget.show();
return a.exec();
}
#include "moc_main.cpp"
Скачать исполнительный файл
Все программы, использующие SDL или Qt. Например:
Qt Creator
PPSSPP
Otter Browser (аналог браузера Opera 12)
Clementine
CoolReader3
qBittorrent
Если ресурсы позволяют в список можно добавить Firefox и Thunderbird.
Qt Creator
PPSSPP
Otter Browser (аналог браузера Opera 12)
Clementine
CoolReader3
qBittorrent
Если ресурсы позволяют в список можно добавить Firefox и Thunderbird.
Я за MinGW, хотя бы потому, что он использует собственный Runtime, работающий на ВСЕХ MS Windows OS, начиная с Win95. В случае с Qt - начиная с 2000/XP. Без всяких установок Visual C++ Redistributable/Visual C++ Runtime и дополнительных библиотек. Просто добавляем в проектный файл такие строки:
QMAKE_LFLAGS +=-static-libgcc -static-libstdc++
Посоветую кросс-платформенный SDL, и его расширение - SDL_mixer.
Вам прямо курс лекций?
Возможно, это то, что вы ищете:
www.lektorium.tv/course/22825
www.lektorium.tv/course/22858
Возможно, это то, что вы ищете:
www.lektorium.tv/course/22825
www.lektorium.tv/course/22858
Попробуйте привести строки к одной общей кодировке, а затем сравнить. Для этого можно воспользоваться библиотекой libiconv:
main.cpp:
main.cpp:
#include <iostream>
#include <fstream>
#include <cstdlib>
using namespace std;
#include <iconv.h>
string iconv_recode(const string from, const string to, string text)
{
iconv_t cnv = iconv_open(to.c_str(), from.c_str());
if (cnv == (iconv_t) - 1) {
iconv_close(cnv);
return "";
}
char *outbuf;
if ((outbuf = (char *) malloc(text.length()*2 + 1)) == NULL) {
iconv_close(cnv);
return "";
}
char *ip = (char *) text.c_str(), *op = outbuf;
size_t icount = text.length(), ocount = text.length()*2;
if (iconv(cnv, &ip, &icount, &op, &ocount) != (size_t) - 1) {
outbuf[text.length()*2 - ocount] = '\0';
text = outbuf;
} else {
text = "";
}
free(outbuf);
iconv_close(cnv);
return text;
}
void compare_strings(const string &aString1, const string &aString2) {
cout << "String 1: " << aString1 << endl
<< "String 2: " << aString2 << endl;
if (aString1 == aString2) {
cout << "Identical strings!" << endl
<< "-----" << endl;
} else {
cout << "Different strings!" << endl
<< "-----" << endl;
}
}
int main()
{
ifstream file_1("word_1.txt"); // The "Proverka" Word in UTF-8
ifstream file_2("word_2.txt"); // The "Proverka" Word in CP1251
string word_1, word_2;
file_1 >> word_1;
file_2 >> word_2;
compare_strings(word_1, word_2);
word_2 = iconv_recode("CP1251", "UTF-8", word_2);
compare_strings(word_1, word_2);
return 0;
}
exl@exl-Lenovo-G560e:~/SandBox/text_enc > enca -L russian word_1.txt
Universal transformation format 8 bits; UTF-8
Doubly-encoded to UTF-8 from ISO-8859-5
exl@exl-Lenovo-G560e:~/SandBox/text_enc > enca -L russian word_2.txt
MS-Windows code page 1251
LF line terminators
exl@exl-Lenovo-G560e:~/SandBox/text_enc > cat word_1.txt
Проверка
exl@exl-Lenovo-G560e:~/SandBox/text_enc > cat word_2.txt
��������
exl@exl-Lenovo-G560e:~/SandBox/text_enc > ./text_coding
String 1: Проверка
String 2: ��������
Different strings!
-----
String 1: Проверка
String 2: Проверка
Identical strings!
-----
Вы неправильно рисуете. Попробуйте так:
qpaintwidget.cpp:
qpaintwidget.h:
И несколько советов:
1. Во-первых, никогда не используйте sleep() или Sleep() (в Windows) в программах на Qt. Так как при вызове этой функции замораживается основной thread, в котором как раз и происходит рендеринг GUI. Отсюда тормоза программы и пр.
2. Никогда не начинайте названия своих классов с буквы Q или q, так как тогда их легко спутать с теми классами, которые входят в библиотеку. Если вам так нужен префикс в имени класса, используйте заглавную C (Class), т. е. ваш класс должен иметь название CPaintWidget или просто PaintWidget.
qpaintwidget.cpp:
#include "qpaintwidget.h"
#include <QPainter>
#include <QDebug>
QPaintWidget::QPaintWidget(QWidget *parent)
: QWidget(parent)
{
offset = 0;
resize(800, 600);
paintTimer = new QTimer(this);
paintTimer->start(10);
connect(paintTimer, SIGNAL(timeout()), this, SLOT(updatePixmap()));
}
void QPaintWidget::paintEvent(QPaintEvent *)
{
QColor whitebrush = Qt::white;
QColor blackbrush = Qt::black;
QColor redbrush = Qt::darkRed;
QPainterPath path;
QPainter painter(this); // Создаём новый объект рисовальщика
painter.setRenderHint(QPainter::Antialiasing);
painter.setPen(Qt::NoPen);
painter.translate(1 + offset, 0);
painter.setBrush(whitebrush);
painter.drawRect(0, 0, width(), height());
QPoint triangle[3] = {
QPoint(180, 450),
QPoint(220, 450),
QPoint(200, 555),
};
painter.setBrush(blackbrush);
painter.drawEllipse(10, 15, 380, 380);
painter.setBrush(redbrush);
painter.drawEllipse(35, 8, 330, 330);
painter.setBrush(whitebrush);
painter.drawEllipse(50, -5, 300, 330);
painter.setBrush(blackbrush);
painter.drawPolygon(triangle, 3);
path.setFillRule(Qt::WindingFill);
path.addRect(180, 250, 40, 200);
path.addRect(150, 250, 100, 20);
painter.drawPath(path);
painter.setBrush(whitebrush);
painter.drawEllipse(120, 260, 60, 20);
painter.drawEllipse(220, 260, 60, 20);
}
void QPaintWidget::updatePixmap()
{
(offset >= 810) ? offset = 0 : offset+=5;
qDebug() << offset;
repaint();
}
QPaintWidget::~QPaintWidget()
{
}
qpaintwidget.h:
#ifndef QPAINTWIDGET_H
#define QPAINTWIDGET_H
#include <QWidget>
#include <QTimer>
class QPaintWidget : public QWidget
{
Q_OBJECT
int offset;
QTimer *paintTimer;
protected:
void paintEvent(QPaintEvent *);
private slots:
void updatePixmap();
public:
QPaintWidget(QWidget *parent = 0);
~QPaintWidget();
};
#endif // QPAINTWIDGET_H
И несколько советов:
1. Во-первых, никогда не используйте sleep() или Sleep() (в Windows) в программах на Qt. Так как при вызове этой функции замораживается основной thread, в котором как раз и происходит рендеринг GUI. Отсюда тормоза программы и пр.
2. Никогда не начинайте названия своих классов с буквы Q или q, так как тогда их легко спутать с теми классами, которые входят в библиотеку. Если вам так нужен префикс в имени класса, используйте заглавную C (Class), т. е. ваш класс должен иметь название CPaintWidget или просто PaintWidget.
Qt 4.8.5 собранный статически;
MinGW 4.4+;
upx.
Вся эта связка поможет вам собрать полностью абстрагированное от внешних библиотек приложение в одном exe-файле, размером ~3-5 MB. Запускаться которое будет везде (от XP до 8, x32, x64) и даже в Wine. + Можно будет перекомпилировать приложение под GNU/Linux и MacOS и оно будет выглядеть там нативно.
Если что, пишите мне на почту (контакты в профиле), я поделюсь с вами статически собранным Qt'ом (на официальном сайте используется версия с динамическими библиотеками) + расскажу и покажу, как сделать подобное приложение. Фреймворк Qt вам понравится, это точно! ^_^
MinGW 4.4+;
upx.
Вся эта связка поможет вам собрать полностью абстрагированное от внешних библиотек приложение в одном exe-файле, размером ~3-5 MB. Запускаться которое будет везде (от XP до 8, x32, x64) и даже в Wine. + Можно будет перекомпилировать приложение под GNU/Linux и MacOS и оно будет выглядеть там нативно.
Если что, пишите мне на почту (контакты в профиле), я поделюсь с вами статически собранным Qt'ом (на официальном сайте используется версия с динамическими библиотеками) + расскажу и покажу, как сделать подобное приложение. Фреймворк Qt вам понравится, это точно! ^_^
Во-первых, компилятор всегда указывает на ошибки и неоднозначности.
Во-вторых, не запуск с отладкой, а компиляция с отладочными символами.
В режиме отладки в собранный исполнительный бинарник добавляются специальные символы, позволяющие посмотреть, в какой функции программа завершилась аварийно. Отладочный бинарник позволяет пройти по стеку вызовов функций, выполнить каждую инструкцию процессора или C/C++-строчку по-порядку. Поставить брекпойнт и.т.д.
Подробнее тут
Во-вторых, не запуск с отладкой, а компиляция с отладочными символами.
В режиме отладки в собранный исполнительный бинарник добавляются специальные символы, позволяющие посмотреть, в какой функции программа завершилась аварийно. Отладочный бинарник позволяет пройти по стеку вызовов функций, выполнить каждую инструкцию процессора или C/C++-строчку по-порядку. Поставить брекпойнт и.т.д.
Подробнее тут
Любой хексовый редактор поможет вам увидеть изображение так, как оно представлено в памяти компьютера.
Никто не программирует "на машинном коде". Максимум - патчи. Машинный код разделяют на данные и, непосредственно код, который дизассемблируют (переводят на более высокий уровень абстракции).
хочу по программировать на машинном коде
Никто не программирует "на машинном коде". Максимум - патчи. Машинный код разделяют на данные и, непосредственно код, который дизассемблируют (переводят на более высокий уровень абстракции).
Флешка какого производителя? Если китайский ноунейм - ее можно смело выбрасывать, проблем с ней вы поимеете много.
Насчет восстановления - вряд ли оно предоставляется возможным. Нужно анализировать файл, смотреть, что в нем битое. Если только заголовок - попытаться восстановить можно, однако, если видеоданные побиты, то ничего не поправишь.
Насчет восстановления - вряд ли оно предоставляется возможным. Нужно анализировать файл, смотреть, что в нем битое. Если только заголовок - попытаться восстановить можно, однако, если видеоданные побиты, то ничего не поправишь.
MY_HEADER_PATH := ../src/headers
LOCAL_C_INCLUDES := $(LOCAL_PATH)/$(SDL_PATH)/include \
$(LOCAL_PATH)/$(SDL_IMAGE_PATH)/ \
$(LOCAL_PATH)/$(SDL_MIXER_PATH)/ \
$(LOCAL_PATH)/$(SDL_TTF_PATH)/ \
$(LOCAL_PATH)/$(MY_HEADER_PATH)/
После этого файлы хэдеры из директории "../src/headers" должны увидеться нормально.
Но почитай внимательно документацию по Android NDK, в частности там может быть переменная
LOCAL_CХХ_INCLUDES :=
или LOCAL_CPP_INCLUDES :=
#!/bin/bash
OLDIFS=$IFS
string=$1
IFS='.'
string_array=($string)
len=$(( ${#string_array[@]} - 1 ))
IFS=$OLDIFS
echo ${string_array[$len]}
exl@exl-Lenovo-G560e:~/SandBox > ./token.sh ..log.f
f
exl@exl-Lenovo-G560e:~/SandBox > ./token.sh .log.ccc
ccc
exl@exl-Lenovo-G560e:~/SandBox > ./token.sh log.qwerty
qwerty
Есть такой шуточный проект-дистрибутив, - RebeccaBlackOS, который создан специально для того, чтобы можно было удовлетворить любопытство и потрогать Wayland/Weston. Представляет собой LiveCD, который можно запустить через виртуалку. Одна из последних версий датируется 2014-02-24. Еще есть мартовская версия 2014-03-01, правда, каталог, в котором она лежит почему-то датируется 2013-ым годом, хотя образы - 2014-ым.
Я пробовал эту сборку полгода назад, очень-очень сырая была. Падало все постоянно, висло, крешилось. Дизайн у приложений написанных с использованием разных тулкитов - разный. И еще куча багов.
Как сейчас обстоит ситуация - не знаю. Если будете пробовать - обязательно отпишитесь о работоспособности.
Кстати, есть ещё Maui project с DE, написанным на Qt5, тоже использует Wayland/Weston. Правда, попробовать этот дистрибутив мне так пока и не довелось. Удачи!
Я пробовал эту сборку полгода назад, очень-очень сырая была. Падало все постоянно, висло, крешилось. Дизайн у приложений написанных с использованием разных тулкитов - разный. И еще куча багов.
Как сейчас обстоит ситуация - не знаю. Если будете пробовать - обязательно отпишитесь о работоспособности.
Кстати, есть ещё Maui project с DE, написанным на Qt5, тоже использует Wayland/Weston. Правда, попробовать этот дистрибутив мне так пока и не довелось. Удачи!
А phonon не рассматривали?
У Python'а и у PHP порог вхождения гораздо, гораздо ниже, чем у C!
Веб-программисту язык C вообще не нужен, и в своей работе веб-программист с ним никак не соприкасается. Учите лучше то, что сейчас в тренде, так быстрее наберетесь опыта.
А по веб-языкам, в частности по PHP, могу посоветовать такую вот книжку.
Для вас первым языком, раз уж вы выбрали профессию веб-программиста, отлично подойдет Python; но никак не C, на который вы точно убьете много времени и сил.
Веб-программисту язык C вообще не нужен, и в своей работе веб-программист с ним никак не соприкасается. Учите лучше то, что сейчас в тренде, так быстрее наберетесь опыта.
А по веб-языкам, в частности по PHP, могу посоветовать такую вот книжку.
Для вас первым языком, раз уж вы выбрали профессию веб-программиста, отлично подойдет Python; но никак не C, на который вы точно убьете много времени и сил.
1. В цикле for нету разницы между постфиксной или префиксной формы декремента/инкремента для переменной-счетчика.
2. Первый проход цикла осуществляется с начальным значением i. Потом переменная-счетчик изменяется и второй проход цикла уже будет со значением i1 и т.д.
3. В вашем случае всё было сделано правильно:
Заметьте, что для значения, которым мы будем инициализировать переменную-счетчик, разница в декременте/инкременте есть:
2. Первый проход цикла осуществляется с начальным значением i. Потом переменная-счетчик изменяется и второй проход цикла уже будет со значением i1 и т.д.
3. В вашем случае всё было сделано правильно:
exl@exl-Lenovo-G560e:~/SandBox > cat test.cpp
#include <iostream>
int main() {
int f = 15;
for(int i = --f; i > 0; --i)
std::cout << i << " ";
std::cout << std::endl;
return 0;
}
exl@exl-Lenovo-G560e:~/SandBox > g++ test.cpp
exl@exl-Lenovo-G560e:~/SandBox > ./a.out
14 13 12 11 10 9 8 7 6 5 4 3 2 1
Заметьте, что для значения, которым мы будем инициализировать переменную-счетчик, разница в декременте/инкременте есть:
exl@exl-Lenovo-G560e:~/SandBox > cat test.cpp
#include <iostream>
int main() {
int f = 15;
for(int i = f--; i > 0; --i)
std::cout << i << " ";
std::cout << std::endl;
return 0;
}
exl@exl-Lenovo-G560e:~/SandBox > g++ test.cpp
exl@exl-Lenovo-G560e:~/SandBox > ./a.out
15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
Классика - Зубков С.В. - Assembler для DOS, Windows и UNIX