Первое приложение Qt на виджетах

Последнее обновление: 08.12.2023

Хотя Qt Creator предоставляет ряд встроенных шаблонов, которые упрощают создание приложения и содержат некоторую базовую функциональность, тем не менее в реальности мы можем определить простейший консольный проект Qt и добавить в него весь функционал с нуля. Такой проект может служить отправной точкой, если нам нам не надо ничего лишнего. Например, при создании нового проекта в Qt Creator выберем шаблон Qt Console Application:

Создание консольного приложения в Qt

В качестве системы построения выберем "qmake":

Установка системы построения для проекта Qt

В итоге у нас будет создан проект с двумя файлами:

Проект консольного приложения в Qt Creator

Как и в любом проекте, файл с расширением .pro (в моем случае "HelloQtApp.pro") представляет файл конфигурации проекта, а сам код программы расположен в файле main.cpp

#include <QCoreApplication>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    return a.exec();
}

Фактически приложение Qt представляет собой класс QCoreApplication. По умолчанию определяется объект этого класса - переменная a, и при создании этого объекта в его конструктор передаются аргументы командной строки. Для запуска приложения у объекта QCoreApplication вызывается метод exec(). После вызова этого метода приложение входит в цикл обработки событий. Завершается приложение, когда пользователь завершит его, например, нажатием на крестик или иным образом.

Если мы запустим данный проект, то окно Application Output сообщит нам, что приложение успешно запущено, тем не менее мы ничего не увидим:

Запуск консольного приложения в Qt Creator

В реальности это было бы консольное приложение, но а данном случае окно Application Output выполняет роль консоли. Нажмем на красный квадратик для завершения приложения.

Причем несмотря на то, что здесь запускается приложение Qt, это все равно приложение на C++, в котором мы можем использовать функционал данного языка. Например, банально выведем строку на консоль, изменив код в main.cpp следующим образом:

#include <QCoreApplication>
#include <iostream>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    std::cout << "Hello METANIT.COM!" << std::endl;
    return a.exec();
}

При запуске окно Application Output мы увидим выводимую строку:

Запуск кода на C++ в консольном приложении в Qt Creator

Но в данном случае нас естественно интересует, как мы можем сделать из него графическое приложение. Для этого вместо класса QCoreApplication используем класс QApplication. В реальности QApplication наследуется от QGuiApplication, а тот, в свою очередь, от QCoreApplication. Поэтому мы можем использовать класс QApplication вместо QCoreApplication.

QApplication позволяет нам добавить виджеты в приложение. Например, добавим виджет типа QWidget. И для этого изменим файл main.cpp следующим образом:

#include <QApplication>
#include <QWidget>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv); // создаем объект приложения
    QWidget widget;               // создаем виджет
    widget.show();                // отображаем виджет
    return app.exec();           // запуск приложения
}

Класс QWidget не определяет какого-то конкретного элемента управления типа кнопки или текстового поля, этот виджет можно отождествлять просто с некоторой прямоугольной областью. И чтобы отобразить виджет, у него вызывается метод show().

Однако Qt Creator может не определять ни класс QApplication, ни класс QWidget, поскольку эти классы находятся в модуле widgets, который по умолчанию не подключен в проект. Нам надо его подключить. Для этого перейдем к файлу конфигурации проекта - файлу с расширением .pro (в моем случае "HelloQtApp.pro"). По умолчанию он должен выглядеть наподобие следующего:

QT = core

CONFIG += c++17 cmdline

SOURCES += main.cpp

# Default rules for deployment.
qnx: target.path = /tmp/$${TARGET}/bin
else: unix:!android: target.path = /opt/$${TARGET}/bin
!isEmpty(target.path): INSTALLS += target

Здесь нам важна первая опция - QT. Она устанавливает используемые в проекте модули. Например, выражение QT = core указывает, что проект будет использовать модуль core. В частности, в этом модуле расположен класс QCoreApplication. Если бы мы не подключили модуль "core", то и класс QCoreApplication мы бы не могли использовать. И поскольку виджеты расположены в модуле widgets, изменим первую строку следующим образом:

QT += widgets

В данном случае не столь важно, напишем мы QT = widgets или QT += widgets, но если потребуется добавить несколько модулей, то для каждого последующего применяется оператор +=

Добавление модулей в проект Qt

Стоит отметить, что если мы компилируем в консоли, а не в Qt Creator, то при изменениях в файле .pro надо выполнять команды:

qmake
make

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

Первое графическое приложение на Qt

То есть мы получаем окно некоторых стандартных размеров с заголовком, который соответствует имени проекта. В реальности, для создания окна приложения вместо QWidget применяются другие виджеты типа QMainWindow, которые позволяют настроить различные аспекты окна. Но теперь добавим в это окно какой-нибудь виджет. И для этого изменим файл main.cpp следующим образом:

#include <QApplication>
#include <QWidget>
#include <QLabel>

int main(int argc, char *argv[])
{
    QApplication app(argc, argv);

    QWidget widget;
    // настраиваем заголовок окна
    widget.setWindowTitle("Qt на METANIT.COM");
    widget.setMinimumHeight(180);  // высота окна
    widget.setMinimumWidth(300);  // ширина окна

    QLabel label{&widget};      // создаем текстовую метку
    label.setText("Hello METANIT.COM"); // установка текста метки

    widget.show();  // отображаем виджет
    return app.exec();
}

Здесь добавлено несколько моментов. Прежде всего устанавливаем отображаемое имя, которое будет применяться в качестве заголовка окна:

widget.setWindowTitle("Qt на METANIT.COM");

С помощью методов класса Widget устанавливаем размеры виджета-контейнера, который фактически выступает в качестве окна

widget.setMinimumHeight(180);  // высота окна
widget.setMinimumWidth(300);  // ширина окна

То есть у нас будет окно с шириной в 300 единиц и высотой в 180 единиц.

Далее создаем текстовую метку - она представляет тип QLabel

QLabel label{&widget};

В конструкторе класса QLabel (и других виджетов) можно передать указатель на виджет, который представляет контейнер и в который будет добавляться метка. То есть в данном случае метка добавляется в контейнер widget.

Затем у метки устанавливается текст:

label.setText("Hello METANIT.COM");

Если мы запустим проект, то мы получим следующее окно

Первое графическое приложение в Qt Creator

Подобным образом можно добавлять и другие виджеты. Можно добавлять один виджеты в другие, создавать сложные композиции, настраивать свойства, различные аспекты виджетов и прочие.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850