31 January 2009

«Hello, World!» на Qt

Qt
Qt — это кросс-платформенный инструментарий разработки ПО на языке программирования C++. Есть также «привязки» ко многим другим языкам программирования: Python — PyQt, Ruby — QtRuby, Java — Qt Jambi, PHP — PHP-Qt и другие.
Позволяет запускать написанное с его помощью ПО в большинстве современных операционных систем путём простой компиляции программы для каждой ОС без изменения исходного кода. Включает в себя все основные классы, которые могут потребоваться при разработке прикладного программного обеспечения, начиная от элементов графического интерфейса и заканчивая классами для работы с сетью, базами данных и XML. Qt является полностью объектно-ориентированным, легко расширяемым и поддерживающим технику компонентного программирования.
В этой статье я покажу как написать простую программу «Hello, World!» с использованием библиотеки Qt4

Среда разработки


Сначала определимся со средой разработки. Лично я для написания программа использую кросс платформенную IDE Code::Blocks (подробнее про работу в этой IDE с Qt4 можно почитать тут). Так же есть плагины для работы с Qt в Eclipse. Коммерческая версия Qt под MS Windows может быть интегрирована в MSVS. Программы так же можно писать в любом текстовом редакторе, а потом компилировать их из командной строки.
Для наглядности, я покажу как компилировать программы, написанные на Qt, вручную.

Первая программа


Сначала в любом текстовом редакторе создадим файл и назовем его, например, main.cpp
Напишем в нем следующее:
  1. #include <QtCore>
  2. #include <QtGui>
  3.  
  4. int main(int argc, char* argv[]) {
  5.     QApplication app(argc, argv);
  6.     QDialog *dialog = new QDialog;
  7.     QLabel *label = new QLabel(dialog);
  8.     label->setText("<font color=red>Hello, World!</font>");
  9.     dialog->show();
  10.     return app.exec();
  11. }
* This source code was highlighted with Source Code Highlighter.

В строках 1 и 2 мы подключили заголовочные файлы Qt в которых находятся основные классы.
В строке 4 мы объявили функцию main — главную функцию, с которой начинается выполнение любой программы. Она возвращает целое число (результат работы программы; 0 — если все в порядке) и принимает на вход две переменные — число параметров командной строки и массив, в котором они сохранены.
В строке 5 мы создаем объект приложения. Этому объекту мы передаем переменные командной строки.
В строке 6 мы создаем диалог — графическое окно прямоугольной формы, с заголовком и кнопками в верхнем правом углу. Создаем метку (строка 7). При создании метки мы передаем ее конструктору указатель на диалог, который становится ее родителем. При удалении родителя автоматически удаляются все его потомки, что очень удобно. Затем устанавливаем надпись метки путем вызова функции setText() (строка 8). Как видно из примера, для отображаемого текста можно использовать html-теги.
В строке 9 мы отображаем наше диалоговое окно с меткой на экране.
И, наконец в строке 10 мы запускаем цикл обработки событий операционной системы приложением. Результат работы объекта мы возвращаем как результат работы программы.

Компиляция


Теперь скомпилируем написанную программу.
Перейдем в каталог, куда мы сохранили наш файл main.cpp и выполним команду

$ qmake -project

При этом произойдет создание заготовки проекта Qt4, в который автоматически будут включены все файлы исходных кодов, лежащих в данной директории. В результате получится файл с именем как у текущей директории и расширением .pro. Он будет выглядеть следующим образом:

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

# Input
SOURCES += main.cpp


Как видим файл с исходными текстами добавился автоматически. Выполним команду

$ qmake

В результате мы получим Makefile, который используем для того что бы скомпилировать программу, выполнив следующую команду:

$ make

Подождем пока процесс компиляции не закончится и запустим нашу первую программу. Она будет выглядеть примерно так:


Вторая программа


Что бы получить полный контроль над создаваемыми окнами и другими виджетами, необходимо создавать производные от них классы. Создадим производный класс MyDialog. В качестве родительского будем использовать класс QDialog. Описание нашего класса поместим в заголовочный файл mydialog.h:
  1. #include <QDialog>
  2. #include <QPushButton>
  3. #include <QLabel>
  4. #include <QVBoxLayout>
  5.  
  6. class MyDialog : public QDialog {
  7.     Q_OBJECT
  8. public:
  9.     MyDialog(QWidget *parent = 0);
  10. };
* This source code was highlighted with Source Code Highlighter.
В первых четырех строках мы подключаем необходимые заголовочные файлы используемых графических элементов — диалога, кнопки, надписи и вертикального менеджера компоновки. Использовать такие крупные заголовочные файлы как <QtGui>, <QtCore> и др. в больших проектах не рекомендуется, так как это увеличивает время компиляции.
В шестой строке мы определили наш класс производным от QDialog.
На следующей строчке мы указали макрос Q_OBJECT, который указывает предпроцессору Qt что данный класс будет использовать дополнительные возможности Qt, например, систему сигналов и слотов.
На строке 9 мы указываем конструктор нашего диалогового окна. У него только один входной параметр — указатель на родительский объект (0 если родителя нет).
Конструктор нашего класса мы определим в файле mydialog.cpp:
  1. #include "mydialog.h"
  2.  
  3. MyDialog::MyDialog(QWidget *parent) : QDialog(parent) {
  4.     QVBoxLayout *layout = new QVBoxLayout(this);
  5.     QLabel *label = new QLabel(this);
  6.     label->setText("<font color=red>Hello, World!</font>");
  7.     QPushButton *button = new QPushButton(this);
  8.     button->setText("Close");
  9.     layout->addWidget(label);
  10.     layout->addWidget(button);
  11.     connect(button, SIGNAL(clicked()), this, SLOT(close()));
  12. }
* This source code was highlighted with Source Code Highlighter.

В строке 4 мы создаем менеджер компоновки, который будет автоматически отображать все добавленные в него виджеты вертикально. Создание надписи аналогично предыдущему примеру.
В строках 7 и 8 создаем кнопку и устанавливаем ее текст. На следующих двух строчках мы добавляем наши виджеты в менеджер компоновки что бы он их автоматически упорядочил.
В строке 11 мы подключаем сигнал нажатия clicked() кнопки button к слоту close() нашего диалогового окна. У каждого объекта Qt могут быть свои сигналы и слоты, которые можно подключать к сигналам и слотам других объектов и таким образом осуществлять коммуникацию между элементами программы.
Файл main.cpp примет следующий вид:
  1. #include <QApplication>
  2. #include "mydialog.h"
  3.  
  4. int main(int argc, char* argv[]) {
  5.     QApplication app(argc, argv);
  6.     MyDialog *dialog = new MyDialog;
  7.     dialog->show();
  8.     return app.exec();
  9. }
* This source code was highlighted with Source Code Highlighter.

Пересоздаем проект командой

$ qmake -project

что бы новые файлы автоматически в него добавились и компилируем его. Вот так выглядит наша новая программа:


Третья программа


Если диалоговое окно содержит много графических элементов, то создавать такие окна довольно утомительно. Для упрощения этого процесса есть инструмент под названием Qt Designer. Запускаем его

$ designer

и выбираем создание диалогового окна без кнопок. Добавляем на него метку и кнопку, редактируем их текст. С помощью инструмента редактора сигналов и слотов (Signal/Slot Editor) подключаем сигнал нажатия clicked() кнопки button к слоту close() диалогового окна. Располагаем их вертикально с помощью менеджера компоновки. Сохраняем полученный файл под именем mydialog.ui. Позже он будет автоматически преобразован в заголовочный файл с именем ui_mydialog.h.
Изменяем заголовочный файл нашего диалогового окна mydialog.h следующим образом:
  1. #include "ui_mydialog.h"
  2.  
  3. class MyDialog : public QDialog, public Ui::Dialog {
  4.     Q_OBJECT
  5. public:
  6.     MyDialog(QWidget *parent = 0);
  7. };
* This source code was highlighted with Source Code Highlighter.

Все заголовочные файлы в нем заменяются на «ui_mydialog.h», а наследование становится множественным.
Конструктор значительно упрощается:
  1. #include "mydialog.h"
  2.  
  3. MyDialog::MyDialog(QWidget *parent) : QDialog(parent) {
  4.     setupUi(this);
  5. }
* This source code was highlighted with Source Code Highlighter.

Функция setupUi определена в заголовочном файле ui_mydialog.h и берет на себя всю рутину по созданию формы
Файл main.cpp по сравнению со второй программой не изменился.
Пересоздаем проект что бы новые файлы автоматически в него добавились и компилируем его.

Заключение


В этой статье было показаны базовые принципы программирования на С++ с использованием Qt4. Если хабрасообществу понравится данная публикация, то я продолжу цикл публикаций об использовании Qt4.
Tags: программирование qt qt4 hello world c
Hubs: Qt
+65
71.3k 107
Comments 72
Ads
Top of the day