Получить исходный код: learnqt-ru.cpp
Qt является широко известным фреймворком для разработки кросс-платформенного программного обеспечения, которое может быть запущено на различных программно-аппаратных платформах практически без изменений в коде, сохраняя при этом мощность и скорость нативных приложений. Хоть Qt и был изначально написан на C++, у него есть реализации и на других языках: PyQt, QtRuby, PHP-Qt и т.д.
Qt отлично подходит для создания приложений с графическим пользовательским интерфейсом (GUI). Это руководство о том, как сделать это на C++.
/*
* Начнём по-старинке
*/
// все header файлы импортированные из Qt начинаются с заглавной 'Q'
#include <QApplication>
#include <QLineEdit>
int main(int argc, char *argv[]) {
// создаем объект для управления данными приложения
QApplication app(argc, argv);
// создаем редактируемую строку и отобразим её на экране
QLineEdit lineEdit("Hello world!");
lineEdit.show();
// запускаем цикл для обработки событий (event loop)
return app.exec();
}
GUI часть Qt полностью состоит из виджетов и связей между ними.
/*
* В этом примере мы отобразим надпись с кнопкой.
* Надпись будет появляться после нажатия на кнопку.
*
* Код на Qt говорит сам за себя.
*/
#include <QApplication>
#include <QDialog>
#include <QVBoxLayout>
#include <QPushButton>
#include <QLabel>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QDialog dialogWindow;
dialogWindow.show();
// добавляем вертикальное расположение
QVBoxLayout layout;
dialogWindow.setLayout(&layout);
QLabel textLabel("Thanks for pressing that button");
layout.addWidget(&textLabel);
textLabel.hide();
QPushButton button("Press me");
layout.addWidget(&button);
// отображаем скрытую надпись после нажатия на кнопку
QObject::connect(&button, &QPushButton::pressed,
&textLabel, &QLabel::show);
return app.exec();
}
Обратите внимание на метод QObject::connect. Этот метод соединяет СИГНАЛЫ одного объекта со СЛОТАМИ другого.
Сигналы отправляются когда с объектами происходят определённые события, например, сигнал нажатие отправляется, когда пользователь нажимает на объект типа QPushButton.
Слоты это действия, которые могут быть выполнены в ответ на полученные сигналы.
(EN) ПОДРОБНЕЕ О СЛОТАХ И СИГНАЛАХ
Далее рассмотрим, как можно не только использовать стандартные виджеты, но и расширять их поведение с помощью наследования. Давайте создадим кнопку и посчитаем, сколько раз она была нажата. Для этого мы определяем наш собственный класс CounterLabel. Он должен быть объявлен в отдельном файле из-за специфической архитектуры Qt.
// counterlabel.hpp
#ifndef COUNTERLABEL
#define COUNTERLABEL
#include <QLabel>
class CounterLabel : public QLabel {
Q_OBJECT // макрос Qt, обязателен для всех виджетов
public:
CounterLabel() : counter(0) {
setText("Counter has not been increased yet"); // метод QLabel
}
public slots:
// действие, которое будет вызвано в ответ на нажатие
void increaseCounter() {
setText(QString("Counter value: %1").arg(QString::number(++counter)));
}
private:
int counter;
};
#endif // COUNTERLABEL
// main.cpp
// Почти тоже самое, что и в предыдущем примере
#include <QApplication>
#include <QDialog>
#include <QVBoxLayout>
#include <QPushButton>
#include <QString>
#include "counterlabel.hpp"
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QDialog dialogWindow;
dialogWindow.show();
QVBoxLayout layout;
dialogWindow.setLayout(&layout);
CounterLabel counterLabel;
layout.addWidget(&counterLabel);
QPushButton button("Push me once more");
layout.addWidget(&button);
QObject::connect(&button, &QPushButton::pressed,
&counterLabel, &CounterLabel::increaseCounter);
return app.exec();
}
Это всё! Конечно, фреймворк Qt намного объемнее, чем часть, которая была рассмотрена в этом руководстве, так что будьте готовы читать и практиковаться.
Удачи!
Хотите предложить свой перевод? Может быть, улучшение перевода? Откройте Issue в репозитории GitHub или сделайте pull request сами!
Первоначально предоставлено автором Aleksey Kholovchuk, и обновлено 4 авторами.