Qt является широко известным фреймворком для разработки кросс-платформенного программного обеспечения, которое может быть запущено на различных программно-аппаратных платформах практически без изменений в коде, сохраняя при этом мощность и скорость нативных приложений. Хоть Qt и был изначально написан на C++, у него есть реализации и на других языках: PyQt, QtRuby, PHP-Qt и т.д.
Qt отлично подходит для создания приложений с графическим пользовательским интерфейсом (GUI). Это руководство о том, как сделать это на C++.
1/*
2 * Начнём по-старинке
3 */
4
5// все header файлы импортированные из Qt начинаются с заглавной 'Q'
6#include <QApplication>
7#include <QLineEdit>
8
9int main(int argc, char *argv[]) {
10 // создаем объект для управления данными приложения
11 QApplication app(argc, argv);
12
13 // создаем редактируемую строку и отобразим её на экране
14 QLineEdit lineEdit("Hello world!");
15 lineEdit.show();
16
17 // запускаем цикл для обработки событий (event loop)
18 return app.exec();
19}
GUI часть Qt полностью состоит из виджетов и связей между ними.
1/*
2 * В этом примере мы отобразим надпись с кнопкой.
3 * Надпись будет появляться после нажатия на кнопку.
4 *
5 * Код на Qt говорит сам за себя.
6 */
7
8#include <QApplication>
9#include <QDialog>
10#include <QVBoxLayout>
11#include <QPushButton>
12#include <QLabel>
13
14int main(int argc, char *argv[]) {
15 QApplication app(argc, argv);
16
17 QDialog dialogWindow;
18 dialogWindow.show();
19
20 // добавляем вертикальное расположение
21 QVBoxLayout layout;
22 dialogWindow.setLayout(&layout);
23
24 QLabel textLabel("Thanks for pressing that button");
25 layout.addWidget(&textLabel);
26 textLabel.hide();
27
28 QPushButton button("Press me");
29 layout.addWidget(&button);
30
31 // отображаем скрытую надпись после нажатия на кнопку
32 QObject::connect(&button, &QPushButton::pressed,
33 &textLabel, &QLabel::show);
34
35 return app.exec();
36}
Обратите внимание на метод QObject::connect. Этот метод соединяет СИГНАЛЫ одного объекта со СЛОТАМИ другого.
Сигналы отправляются когда с объектами происходят определённые события, например, сигнал нажатие отправляется, когда пользователь нажимает на объект типа QPushButton.
Слоты это действия, которые могут быть выполнены в ответ на полученные сигналы.
(EN) ПОДРОБНЕЕ О СЛОТАХ И СИГНАЛАХ
Далее рассмотрим, как можно не только использовать стандартные виджеты, но и расширять их поведение с помощью наследования. Давайте создадим кнопку и посчитаем, сколько раз она была нажата. Для этого мы определяем наш собственный класс CounterLabel. Он должен быть объявлен в отдельном файле из-за специфической архитектуры Qt.
1// counterlabel.hpp
2
3#ifndef COUNTERLABEL
4#define COUNTERLABEL
5
6#include <QLabel>
7
8class CounterLabel : public QLabel {
9 Q_OBJECT // макрос Qt, обязателен для всех виджетов
10
11public:
12 CounterLabel() : counter(0) {
13 setText("Counter has not been increased yet"); // метод QLabel
14 }
15
16public slots:
17 // действие, которое будет вызвано в ответ на нажатие
18 void increaseCounter() {
19 setText(QString("Counter value: %1").arg(QString::number(++counter)));
20 }
21
22private:
23 int counter;
24};
25
26#endif // COUNTERLABEL
1// main.cpp
2// Почти тоже самое, что и в предыдущем примере
3
4#include <QApplication>
5#include <QDialog>
6#include <QVBoxLayout>
7#include <QPushButton>
8#include <QString>
9#include "counterlabel.hpp"
10
11int main(int argc, char *argv[]) {
12 QApplication app(argc, argv);
13
14 QDialog dialogWindow;
15 dialogWindow.show();
16
17 QVBoxLayout layout;
18 dialogWindow.setLayout(&layout);
19
20 CounterLabel counterLabel;
21 layout.addWidget(&counterLabel);
22
23 QPushButton button("Push me once more");
24 layout.addWidget(&button);
25 QObject::connect(&button, &QPushButton::pressed,
26 &counterLabel, &CounterLabel::increaseCounter);
27
28 return app.exec();
29}
На почитать ¶
Это всё! Конечно, фреймворк Qt намного объемнее, чем часть, которая была рассмотрена в этом руководстве, так что будьте готовы читать и практиковаться.
Удачи!