Назад Содержание Вперед

Простейшее приложение Qt4

Попробуем создать пустое окно и вывести его на экран.

Листинг 1. Простейшее приложение 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 }
Пояснения к программе:

Перед компиляцией программы надо сначала создать проект Qt (файл с расширением .pro), для этого требуется войти в тот каталог, в котором находится cpp-файл с исходным текстом, и запустить утилиту qmake с параметром -project. Имя cpp-файла можно не указывать. По умолчанию имя файла проекта будет совпадать с названием каталога, в котором происходит сборка программы. Для задания другого имени pro-файла при вызове qmake надо указать параметр -o. Например, для нашего первого проекта будет создан файл 00.pro следующего содержания:

TEMPLATE = app
TARGET = 00
DEPENDPATH += .
INCLUDEPATH += .

# Input
SOURCES += 00.cpp
После создания pro-файла можно сгенерировать make-файл, для чего достаточно запустить утилиту qmake ещё раз, но уже без указания каких-либо ключей (или задать параметр -makefile ФайлПроекта.pro). Только после этого можно начинать компиляцию с помощью обычной команды mingw32-make (в случае использования компилятора MinGW), nmake (для Microsoft~C++), make (для g++ в Linux) и т.п. При этом можно явно указать имя make-файла, для этого все перечисленные компиляторы распознают ключ -f. Поскольку в процессе разработки программу приходится много раз перекомпилировать, вышеописанный процесс лучше всего проводить с помощью командного файла 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

Теперь, как и обещали, обсудим вопрос о символах кириллицы. Библиотека Qt предлагает несколько решений для национальных алфавитов, отличных от стандартной латиницы. Первый вариант -- использовать функцию QString::fromLocal8Bit. Дело в том, что для работы со строковыми значениями в Qt имеется класс QString, который оперирует двухбайтными символами Unicode. Для преобразования обычных строк с однобайтными символами к типу QString как раз и предназначен метод fromLocal8Bit. При этом используется системная кодировка (в Windows --- cp1251, в Linux -- обычно koi8-r).

Недостаток данного варианта заключается в том, что если программа, например, разрабатывалась в системе Windows, а затем мы захотели скомпилировать её исходные тексты в Linux, где используется другая кодовая таблица для символов кириллицы, то предварительно придётся осуществить перекодировку исходных текстов, иначе после компиляции все русские сообщения окажутся нечитаемыми.

Изменённый текст нашей первой программы приведён в листинге 2, а внешний вид окна в системе Linux для двух разных тем рабочего стола показан на рис.

Листинг 2

    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 }

Второй вариант работы с символами кириллицы -- явное использование кодеков (специальных объектов для перекодировки строк). Соответствующий класс QTextCodec определён в заголовочном файле с тем же именем (без расширения! Заголовочные файлы с расширением .h используются только в старых проектах Qt3). При создании кодека надо указать название используемой кодовой таблицы, например:

QTextCodec *codec = QTextCodec::codecForName("CP1251");
Затем надо связать этот кодек со всеми строками C++:
QTextCodec::setCodecForCStrings(codec);
Поскольку при создании кодека указана конкретная кодовая таблица, то исход компиляции исходных текстов не зависит от системной кодировки той платформы, на которой производится сборка программы: результат будет везде одним и тем же. Но файлы с исходными текстами программ в этом случае нельзя подвергать перекодировке (или после перекодировки требуется изменить название кодовой таблицы, заданной при создании кодека). В листинге 3 приведён новый вариант нашей программы.

Листинг 3

    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.

Листинг 4

    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 }


Назад Содержание Вперед