Первая программа на Qt

Создадим простейшее оконное приложение. Для этого в меню Файл выбираем пункт Создать файл или проект. В открывшемся окне (рис. 1.21) в списке слева выбираем пункт Приложение (Qt), а затем справа пункт Приложение Qt Widgets. Нажимаем кнопку Выбрать. На следующем шаге (рис. 1.22) в поле Название вводим Test, в поле Создать в добавляем путь C:\cpp\projectsQt. Нажимаем кнопку Далее. На следующем шаге (рис. 1.23) из списка Система сборки выбираем пункт qmake и нажимаем кнопку Далее. На следующем шаге (рис. 1.24) задаем следующие значения:

  • в поле Имя класса вводим Widget;
  • из списка Базовый класс выбираем пункт QWidget;
  • сбрасываем флажок Создать форму.

На следующем шаге (рис. 1.25) нажимаем кнопку Далее. На следующем шаге (рис. 1.26) устанавливаем флажок Desktop Qt 6.1.0 MinGW 64-bit. Нажимаем кнопку Подробнее и изменяем пути по умолчанию. В поле Отладка вводим значение C:\cpp\projectsQt\Test-Debug, а в поле Выпуск — значение C:\cpp\projectsQt\Test-Release. Нажимаем кнопку Далее. На следующем шаге (рис. 1.27) нажимаем кнопку Завершить.

1_21.png

Рис. 1.21. Создание оконного приложения. Шаг 1

1_22.png

Рис. 1.22. Создание оконного приложения. Шаг 2

1_23.png

Рис. 1.23. Создание оконного приложения. Шаг 3

1_24.png

Рис. 1.24. Создание оконного приложения. Шаг 4

1_25.png

Рис. 1.25. Создание оконного приложения. Шаг 5

1_26.png

Рис. 1.26. Создание оконного приложения. Шаг 6

1_27.png

Рис. 1.27. Создание оконного приложения. Шаг 7

В результате будет создан каталог C:\cpp\projectsQt\Test с файлами проекта. Содержимое файла Test.pro будет выглядеть так:

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

CONFIG += c++11

# You can make your code fail to compile if it uses deprecated APIs.
# In order to do so, uncomment the following line.
#DEFINES += QT_DISABLE_DEPRECATED_BEFORE=0x060000    # disables all the APIs deprecated before Qt 6.0.0

SOURCES += \
    main.cpp \
    widget.cpp

HEADERS += \
    widget.h

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

При изучении языков и технологий принято начинать с программы, выводящей надпись Привет, мир!. Не будем нарушать традицию и создадим окно с приветствием и кнопкой для закрытия окна. В файл C:\cpp\projectsQt\Test\main.cpp добавляем программу из листинга 1.2.

Листинг 1.2. Первая программа на Qt

#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>

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

   QWidget window;
   window.setWindowTitle("Первая программа на Qt");
   window.resize(300, 70);

   QLabel *label = new QLabel("<center>Привет, мир!</center>");
   QPushButton *btnQuit = new QPushButton("&Закрыть окно");
   QVBoxLayout *vbox = new QVBoxLayout();
   vbox->addWidget(label);
   vbox->addWidget(btnQuit);
   window.setLayout(vbox);
   QObject::connect(btnQuit, SIGNAL(clicked()),
                    &app, SLOT(quit()));

   window.show();
   return app.exec();
}

Чтобы преобразовать текстовый файл main.cpp с программой в исполняемый EXE-файл делаем текущей вкладку с содержимым файла main.cpp и слева сначала выбираем пункт Отладка, а затем нажимаем кнопку Запустить (содержит значок в виде зеленого треугольника) или нажимаем комбинацию клавиш <Ctrl>+<R>. Можно также в меню Сборка выбрать пункт Запустить. Если все сделано правильно, то отобразится окно, показанное на рис. 1.28.

1_28.png

Рис. 1.28. Результат выполнения программы

Структура программы

Запускать программу мы научились, теперь рассмотрим код из листинга 1.2 построчно. В первых строках подключаются необходимые заголовочные файлы:

#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QPushButton>
#include <QVBoxLayout>

Далее определяется функция main(), которая является точкой входа в приложение. Через первый параметр (argc) доступно количество аргументов, переданных в командной строке. Следует учитывать, что первым аргументом является название исполняемого файла, поэтому значение параметра argc не может быть меньше единицы. Через второй параметр (argv) доступны все аргументы в виде строки (тип char *). Квадратные скобки после названия второго параметра означают, что доступен массив строк.

Инструкция

QApplication app(argc, argv);

создает объект приложения с помощью класса QApplication. Конструктор этого класса принимает количество и список параметров, переданных в командной строке. Следует помнить, что в программе всегда должен быть объект приложения, причем обязательно только один. Может показаться, что после создания объекта он больше нигде не используется в программе, однако с помощью этого объекта осуществляется управление приложением незаметно для нас. Получить доступ к этому объекту из любого места в программе можно через макрос qApp, который преобразуется в указатель на объект приложения. Например, вывести список параметров, переданных в командной строке, можно так:

qDebug() << qApp->arguments();

Результат при запуске программы:

QList("C:\\cpp\\projectsQt\\Test-Debug\\debug\\Test.exe")

Следующая инструкция

QWidget window;

создает объект окна с помощью класса QWidget. Этот класс наследуют практически все классы, реализующие компоненты графического интерфейса. Поэтому любой компонент, не имеющий родителя, обладает своим собственным окном.

Инструкция

window.setWindowTitle("Первая программа на Qt");

задает текст, который будет выводиться в заголовке окна. Следующая инструкция

window.resize(300, 70);

задает минимальные размеры окна. В первом параметре метода resize() указывается ширина окна, а во втором параметре — высота окна. Следует учитывать, что эти размеры не включают высоту заголовка окна и ширину границ, а также являются рекомендацией, т. е. если компоненты не помещаются, размеры окна будут увеличены.

Инструкция

QLabel *label = new QLabel("<center>Привет, мир!</center>");

создает объект надписи. Текст надписи задается в качестве параметра в конструкторе класса QLabel. Обратите внимание на то, что внутри строки мы указали HTML-теги. В данном примере с помощью тега <center> произвели выравнивание текста по центру компонента. Возможность использования HTML-тегов и CSS-атрибутов является отличительной чертой библиотеки Qt. Например, внутри надписи можно вывести таблицу или отобразить изображение. Это очень удобно.

Следующая инструкция

QPushButton *btnQuit = new QPushButton("&Закрыть окно");

создает объект кнопки. Текст, который будет отображен на кнопке, задается в качестве параметра в конструкторе класса QPushButton. Обратите внимание на символ & перед буквой "З". Таким образом задаются клавиши быстрого доступа. Если нажать одновременно клавишу <Alt> и клавишу с буквой, перед которой в строке указан символ &, то кнопка будет нажата.

Инструкция

QVBoxLayout *vbox = new QVBoxLayout();

создает вертикальный контейнер. Все компоненты, добавляемые в этот контейнер, будут располагаться друг под другом в порядке добавления. Внутри контейнера автоматически производится подгонка размеров добавляемых компонентов под размеры контейнера. При изменении размеров контейнера будет произведено изменение размеров всех компонентов. В следующих двух инструкциях

vbox->addWidget(label);
vbox->addWidget(btnQuit);

с помощью метода addWidget() производится добавление объектов надписи и кнопки в вертикальный контейнер. Так как объект надписи добавляется первым, он будет расположен над кнопкой. При добавлении компонентов в контейнер, они автоматически становятся потомками контейнера.

Следующая инструкция

window.setLayout(vbox);

добавляет контейнер в основное окно с помощью метода setLayout(). Таким образом, контейнер становится потомком основного окна.

Инструкция

QObject::connect(btnQuit, SIGNAL(clicked()),
                 &app, SLOT(quit()));

назначает обработчик сигнала clicked(), который генерируется при нажатии кнопки. В первом параметре статического метода connect() передается указатель на объект, генерирующий сигнал, а во втором параметре — название сигнала с помощью макроса SIGNAL(). В третьем параметре передается указатель на объект, принимающий сигнал, а в четвертом параметре — метод этого объекта, который будет вызван при наступлении события. Метод указывается в качестве параметра макроса SLOT(). Этот метод принято называть слотом. В нашем примере получателем сигнала является объект приложения, доступный также через указатель qApp. При наступлении события будет вызван метод quit(), который завершит работу всего приложения. Пример указания макроса qApp:

QObject::connect(btnQuit, SIGNAL(clicked()),
                 qApp, SLOT(quit()));

Следующая инструкция

window.show();

отображает окно и все компоненты, которые мы ранее добавили. И, наконец, инструкция

return app.exec();

запускает бесконечный цикл обработки событий. Инструкции, расположенные после вызова метода exec(), будут выполнены только после завершения работы приложения. Так как результат выполнения метода exec() мы возвращаем из функции main(), дальнейшее выполнение программы будет прекращено, а код возврата передан операционной системе.

Учебник C++ (Qt Creator и MinGW)
Учебник C++ (Qt Creator и MinGW) в формате PDF

Помощь сайту

ЮMoney (Yandex-деньги): 410011140483022

ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов