Рассмотрим те элементы, которые создала программа при создании первого проекта. Он содержит файлы MyProgect.pro, mainwindow.h, mainwindow.cpp, main.cpp, mainwindow.ui (см. 1 на рис. 3). MyProgect.pro – управляющий файл проекта. В нем перечислены все элементы, используемые в проекте, в частности модули библиотеки.
QT += core gui
greaterThan(QT_MAJOR_VERSION, 4):QT += widgets
TARGET = test
TEMPLATE = app
SOURCES += main.cpp\
mainwindow.cpp
HEADERS += mainwindow.h
FORM += mainwindow.ui
Названия наиболее значимых элементов проекта приведены в [Иванова с. 13], [Шлее Qt4 2007, с 65-67]. Мы рассмотрим только подключение модулей. Это текстовая запись вида QT += <имя_модуля>. Все, используемые в проекте модули могут быть перечислены в одной строке (QT += core gui). В таблице ниже перечислены наиболее востребованные из них.
Таблица 2 – модули Qt
Модуль | Назначение | Типовые классы |
core | Базовые классы не содержащие графические элементы | QString, QStringList, QDebug, QDir, QFile, QTimer, QElapsedTimer, QThread |
gui | Базовые классы для создания графического интерфейса пользователя (GUI) | QBitmap, QIcon, QImage, QPixmap, QPicture, QVector2D, QVector3D, QVector4D, QPaintEvent, QWindow |
widgets | Классы графических интерфейсов | QDialog, QMainWindows, QFileDialog, QInputDialog, QLineEdit, QTextEdit, QTreeWidget |
multimedia | Классы для управления аудио, видео и камерой. | QCamera, QMediaPlayer, QMediaPlaylist, QMediaResource, QSound, QSoundEffect |
multimediawidgets | Классы графического интерфейса для классов модуля multimedia | QVideoWidget, QVideoWidgetControl, QCameraViewfinder, QGraphicsVideoItem |
charts | Классы для построения графиков функций | QChart, QChartView, QLineSeries |
opengl | Классы для создания трёхмерной графики |
Дополнительные сведения о редактировании pro-файлов см. в. Файл main.cpp – главный файл проекта. В нём создаётся функция main – главная функция проекта. Содержимое файла:
#include "mainwindow.h"
#include <QApplication>
int main(int argc, char* argv[])
{
QApplication a(argc, argv);
MainWindow w;
w.show();
return a.exec();
}
Аргументы функции main служат для взаимодействия программы с операционной системой. Операционная система позволяет запускать программу различными способами, например, из командной строки или с помощью ярлыка. При этом после имени программы могут быть указаны аргументы, количество которых заранее неизвестно. Все аргументы передаются программе в виде массива строк argv, а их количество – в виде целой переменной argс. В файле создаётся 2 объекта классов QApplication и MainWindow. QApplication является стандартным объектом библиотеки Qt. MainWindow – новый класс, созданный в нашем проекте по заготовленному шаблону. Для написания простых приложений не возникает необходимость изменять функцию main. Поэтому не будем на ней останавливаться и перейдём к рассмотрению класса MainWindow. Параллельно будем рассматривать необходимые теоретические сведения. Класс, по сути, является типом данных. Поэтому запись
MainWindow w;
аналогична записи
int i;
Класс объектов (или просто класса) – программная структура, в которой данные и функции для их обработки образуют единое целое. Этот принцип называется инкапсуляция (от англ. «содержание в оболочке»). Все файлы с названиями mainwindow содержат описание одноимённого класса. На его примере рассмотрим теорию их создания. Начитается всё с описания интерфейсов класса. Оно дано в файле mainwindow.h.
Начинается описание с ключевого слова class, за которым следует его имя. Имя каждого класса должно быть уникальным. после этого через двоеточие записаны ключевое слово public и название класса прародителя.
необязательная метка имя класса прародителя |
class MainWindow: public QMainWindow |
обязательная метка имя класса |
Это пример реализации принципа наследования, используемого в C++. Его применение приводит к тому, что наш класс обладает всеми данными и функциями, которые заданы в прародителе. Любые функции в новом объекте могут быть переопределены. Далее следует описание класса. Начинается оно со специального макроса Q_OBJECT, используемого в объектах библиотеки Qt для поддержки сигналов и слотов [Шлее Qt4 2007 с. 40, 68]. Основное описание, включающее переменные и функции находится состоит из трёх блоков, озаглавленных private (собственный), protected (защищённый, в типовой реализации отсутствует), public (общедоступный).
Хорошим стилем программирования считается организация доступа к элементам данных с помощью функций или методов без использования оператора присваивания.
Далее записываются две функции (конструктор и деструктор). Название конструктора совпадает с названием класса. Эта функция срабатывает при создании класса.
explicit MainWindow(QWidget *parent = 0);
Необязательное ключевое слово explicit используется в C++ для создания «явных конструкторов». В данной программе его можно удалить. Деструктор, имя которого состоит из знака тильда («~») и название класса. Он срабатывает при удалении объекта.
~MainWindow();
В разделе private объявлен объект указатель на объект Ui::MainWindow
Ui::MainWindow *ui;
Этот указатель специфического типа запись говорит о том, что объект будет получать наследовать объекты из редактора Qt Designer (см. ниже). С его помощью можно получить доступ ко всем объектам, размещённым на форме.
Доступ к элементам класса, как и к элементам структур, осуществляется с помощью оператора «.» как это сделано в файле main. Если объект создан через указатель, то доступ осуществляется с помощью оператора «–>». Поэтому запись
MainWindow *w;
w = new MainWindow;
w->show();
идентична записи в файле main, приведённой выше. Редактор Qt Creator содержит функцию подмены оператора «.» на оператор «->». Так, работая с любым объектом, для использования его внутренних функций нужно ввести его имя и нажать «.». Если объект имеет место работа с указателем на объект, то произойдёт замена операторов.
В файле mainwindow.cpp реализованы все объявленные в mainwindow.h функции (в данном случае конструктор и деструктор). Как и для простых функций, для функций-элементов класса существует возможность реализации в точке объявления. Но, как правило, используется разделение объявления (интерфейса) и реализации. Поэтому реализация выглядит следующим образом
MainWindow::MainWindow(QWidget *parent):
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
}
MainWindow::~ MainWindow ()
{
delete ui;
}
В конструкторе производится лишь одна операция – привязка формы (ui) к нашему объекту. Для этих случаев в c++ предусмотрен указатель this. Этим указателем можно пользоваться так, как если бы некий объект уже был создан и мы уже его используем. В деструкторе производится толь удаление объекта формы. Такая простота описания обусловлена преимуществами, предоставляемыми наследованием. Так запись QMainWindow(parent) запускает конструктор объекта-родителя. То есть, новый класс настраивается идентично старому.
Следующим типовым шагом является размещение на форме графических элементов управления и отображения (виджетов). Это можно сделать двумя способами. С помощью функций в коде и с помощью визуального редактора Qt Designer. В данном пособии рассмотрен только второй. Необходимые виджеты могут быть созданы и размещены на форме без использования визуального редактора [с. Иванова 33-36], что в данном пособии не рассматривается.
В библиотеки Qt 5 существует альтернативная возможность создания графического интерфейса пользователя с помощью языка QML. Такой способ ориентирован на разработку приложение для сенсорных устройств (планшетов и т.п.), что также выходит за рамки данного пособия.