Build.cmd
. Например, в системе Windows: 1 qmake -project -o 00.pro 00.cpp 2 qmake -makefile 00.pro 3 4 rem mingw32-make -f Makefile.Debug 5 mingw32-make -f Makefile.Release 6 7 pause
(1) Создаём файл
Кодеков
(специальных объектов для перекодировки строк). Соответствующий класс QTextCodec определён в заголовочном файле с тем же именем (без расширения! Заголовочные файлы с расширением .h используются только в старых проектах Qt3). При создании кодека надо указать название используемой кодовой таблицы, например: QTextCodec *codec = QTextCodec::codecForName("CP1251"); Затем надо связать этот кодек со всеми строками C++: QTextCodec::setCodecForCStrings(codec); Поскольку при создании кодека указана конкретная кодовая таблица, то исход компиляции исходных текстов не зависит от системной кодировки той платформы, на которой производится сборка программы: результат будет везде одним и тем же. Но файлы с исходными текстами программ в этом случае нельзя подвергать перекодировке (или после перекодировки требуется изменить название кодовой таблицы, заданной при создании кодека). В листинге 3 приведён новый вариант нашей программы.
Простейшее приложение Qt (файл examples-qt/00/00.cpp)
1 // Простейшее приложение Qt4 (пустое окно) 2 3 #include <QApplication>
4 #include <QMainWindow>
5 6 int main(int argc, char *argv[]) { 7 8 QApplication app(argc, argv);
9 10 QMainWindow *mw = new QMainWindow(0, Qt::Window);
11 mw->
setWindowTitle("Hello Qt4");
12 mw->
resize(400, 300);
13 mw->
show();
14 15 return app.exec();
16 } Пояснения к программе:
Подключили заголовочные файлы с определениями классов QApplication (приложение) и QMainWindow (главное окно). Обычный для C++ заголовок главной функции main с аргументами командной строки. Объявили переменную типа QApplication (приложение), передав конструктору параметры командной строки, которые, возможно, указаны при запуске программы (argc -- число параметров, argv -- указатель на массив строковых значений). Создали главное окно приложения. Первый параметр конструктора указывает на родительский элемент (в данном случае 0 -- окно не имеет родителя), а второй -- набор битовых флагов, влияющих на внешний вид окна (флаг Qt::Windows означает, что элемент будет выглядеть, как окно приложения, т.е. будет иметь строку заголовка с системными кнопками для сворачивания на панель задач, закрытия и т.д.). Задали текст заголовка окна (пока мы избегаем использовать символы кириллицы, этому вопросу будет посвящены следующие примеры). Определили размеры окна (ширину и высоту) в пикселах. Вывели окно на экран. Запустили цикл обработки событий, происходящих с элементами приложения. Пока в нашей программе никакие события не определены, кроме стандартных реакций на действия пользователя (изменение размеров и положения окна, нажатие кнопок в строке заголовка).
Перед компиляцией программы надо сначала создать проект Qt (файл с расширением .pro), для этого требуется войти в тот каталог, в котором находится cpp-файл с исходным текстом, и запустить утилиту
Простейшее приложение Qt4
1 // Простейшее приложение Qt4 (пустой фрейм) 2 // Вариант с кириллицей в заголовке 3 4 #include <QApplication>
5 #include <QMainWindow>
6 7 int main(int argc, char *argv[]) { 8 9 QApplication app(argc, argv);
10 11 QMainWindow *mw = new QMainWindow(0, Qt::Window);
12 mw->
setWindowTitle(QString::fromLocal8Bit("Пустое окно Qt4"));
13 mw->
resize(400, 300);
14 mw->
show();
15 16 return app.exec();
17 }
Второй вариант работы с символами кириллицы -- явное использование
с символами национальных алфавитов связан
1 // Простейшее приложение Qt4 (пустой фрейм) 2 // Кодеки 3 4 #include <QApplication>
5 #include <QMainWindow>
6 #include <QTextCodec>
7 8 int main(int argc, char *argv[]) { 9 10 QApplication app(argc, argv);
11 12 QTextCodec *codec = QTextCodec::codecForName("CP1251");
13 QTextCodec::setCodecForCStrings(codec);
14 15 QMainWindow *mw = new QMainWindow(0, Qt::Window);
16 mw->
setWindowTitle("Пустое окно Qt4");
17 mw->
resize(400, 300);
18 mw->
show();
19 20 return app.exec();
21 } Наконец, третий (наиболее предпочтительный) метод работы с символами национальных алфавитов связан с использованием специальной функции перевода tr, с помощью которой осуществляется интернационализация приложений. Подробнее этот вопрос мы обсудим позже, а пока договоримся все строковые константы, указанные в тексте программы, передавать в качестве параметра функции tr. Эта статическая функция является членом всех классов Qt, порождённых от базового класса QObject, но если, как сейчас, мы собираемся вызвать её в главной программе, а не в каком-либо методе класса, то приходится указывать какой-нибудь подходящий объект, например, QObject::tr. Для указания кодировки, используемой функцией перевода, надо создать соответствующий кодек и передать его в качестве аргумента методу setCodecForTr. Окончательный вариант нашей программы показан в листинге4.
Простейшее приложение Qt4
1 // Простейшее приложение Qt4 (пустой фрейм) 2 // Кодеки и функция tr() 3 4 #include <QApplication>
5 #include <QMainWindow>
6 #include <QTextCodec>
7 8 int main(int argc, char *argv[]) { 9 10 QApplication app(argc, argv);
11 12 QTextCodec *codec = QTextCodec::codecForName("CP1251");
13 QTextCodec::setCodecForTr(codec);
14 15 QMainWindow *mw = new QMainWindow(0, Qt::Window);
16 mw->
setWindowTitle(QMainWindow::tr("Пустое окно Qt4"));
17 18 mw->
resize(400, 300);
19 mw->
show();
20 21 return app.exec();
22 }
Make
(для g++ в Linux) и т.п. При этом можно явно указать имя make-файла, для этого все перечисленные компиляторы распознают ключ -f. Поскольку в процессе разработки программу приходится много раз перекомпилировать, вышеописанный процесс лучше всего проводить с помощью командного файла
Pro
следующего содержания: TEMPLATE = app TARGET = 00 DEPENDPATH += . INCLUDEPATH += .
# Input SOURCES += 00.cpp После создания pro-файла можно сгенерировать make-файл, для чего достаточно запустить утилиту
. (2) Создаём make-файл. (4) Выполняем компиляцию в режиме Debug, т.е. с информацией для отладчика (в данном случае строка закомментирована). (5) Повторяем компиляцию в режиме Release (без возможности отладки на уровне исходного текста программы). (7) Ждём нажатия любой клавиши (чтобы окно не закрылось раньше времени и мы успели прочитать все сообщения компилятора).
Теперь, как и обещали, обсудим вопрос о символах кириллицы. Библиотека Qt предлагает несколько решений для национальных алфавитов, отличных от стандартной латиницы. Первый вариант -- использовать функцию QString::fromLocal8Bit. Дело в том, что для работы со строковыми значениями в Qt имеется класс QString, который оперирует двухбайтными символами Unicode. Для преобразования обычных строк с однобайтными символами к типу QString как раз и предназначен метод fromLocal8Bit. При этом используется системная кодировка (в Windows --- cp1251, в Linux -- обычно koi8-r).
Недостаток данного варианта заключается в том, что если программа, например, разрабатывалась в системе Windows, а затем мы захотели скомпилировать её исходные тексты в Linux, где используется другая кодовая таблица для символов кириллицы, то предварительно придётся осуществить перекодировку исходных текстов, иначе после компиляции все русские сообщения окажутся нечитаемыми.
Изменённый текст нашей первой программы приведён в листинге2, а внешний вид окна в системе Linux для двух разных тем рабочего стола показан на рис.
Попробуем создать пустое окно и вывести его на экран.
Qmake
с параметром -project. Имя cpp-файла можно не указывать. По умолчанию имя файла проекта будет совпадать с названием каталога, в котором происходит сборка программы. Для задания другого имени pro-файла при вызове
надо указать параметр -o. Например, для нашего первого проекта будет создан файл
ещё раз, но уже без указания каких-либо ключей (или задать параметр -makefileФайлПроекта.pro). Только после этого можно начинать компиляцию с помощью обычной команды