Поделиться страницей

Изучите X за Y минут

Где X=Qt Framework

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

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

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

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

Удачи!


Хотите предложить свой перевод? Может быть, улучшение перевода? Откройте Issue в репозитории GitHub или сделайте pull request сами!

Первоначально предоставлено автором Aleksey Kholovchuk, и обновлено 4 авторами.