qt.md

Личный сайт Go-разработчика из Казани

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 полностью состоит из виджетов и связей между ними.

(EN) ПОДРОБНЕЕ О ВИДЖЕТАХ

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 намного объемнее, чем часть, которая была рассмотрена в этом руководстве, так что будьте готовы читать и практиковаться.

(EN) ДОКУМЕНТАЦИЯ

Удачи!