Создание графических интерфейсов пользователя с использованием Qt 5.12 (1245345), страница 5
Текст из файла (страница 5)
Этот класс может строиться двумя способами:1) как наследуемый от двух классов: класса, на базе объекта которого строится окно приложения, класса, описание которого получается автоматически при обработке созданногоQt Designer файла формы компилятором UIC;2) как композиция или агрегация тех же классов.Во втором случае объект класса, наследуемого от класса Qt, включает поле автоматически созданного класса или содержит указатель на него ( рисунок 1.14).Класс образаокнаQWidgetКласс окнаaQWidgetQWidgetКласс образаокнаКласс окнаКласс образаокнаКласс окнабвРисунок 1.14 – Возможные варианты подключения автоматически созданного класса образа окна:а – множественное наследование; б – композиция; в – наполнение (агрегация)Вариант множественного наследования удобнее при написании программы, поскольку при обращении к полям и методам родительского класса не требуется дополнительно указывать имя поля (обычного или указателя), поэтому желательно использоватьименно его.При использовании множественного наследования описание класса окна нашегоприложения в файле Win.h должно выглядеть так:#ifndef win_H#define win_H#include <QtWidgets/QWidget>#include "ui_form.h" // заголовок сгенерированный UICclass Win : public QWidget, public Ui::win{Q_OBJECTpublic:Win( QWidget *parent = Q_NULLPTR);};#endifКласс win – класс, автоматически созданный при работе Qt Designer и описанный вфайле ui_form.h, Ui – имя адресного пространства, объявленного Qt Designer.
Однимиз методов этого класса является метод setupUi, который обеспечивает изображение изаданную реакцию формы. Конструктор класса окна, описываемый в файле реализацииWin.cpp, должен вызывать этот метод для построения окна:#include <Win.h>Win::Win(QWidget *parent):QWidget(parent){setupUi(this); // конструирование формы};После этого основной программе остается только создать объект-приложение и объект-окно, визуализировать форму и ее виджеты и запустить цикл обработки сообщений:#include "win.h"#include <QtWidgets/QApplication>int main(int argc, char *argv[]){QApplication app(argc, argv);Win w;w.show();return app.exec();// запуск цикла обработки сообщений}Компиляция-сборка программы в этом случае может осуществляться в командномрежиме, как указано в разделе 1.3, или с помощью среды Microsoft Visual Studio, как предлагается в разделе 1.4.Интересно посмотреть автоматически созданное описание класса окна в файлеui_form.h:#ifndef UI_FORM_H// защита от повторной компиляции#define UI_FORM_H#include <QtCore/QVariant> // подключение заголовков файлов Qt#include <QtWidgets/QApplication>#include <QtWidgets/QFormLayout>#include <QtWidgets/QLabel>#include <QtWidgets/QPushButton>#include <QtWidgets/QVBoxLayout>#include <QtWidgets/QWidget>QT_BEGIN_NAMESPACE// метка начала пространства именclass Ui_win// описание базового класса для класса окна{public:QFormLayout *formLayout; // горизонтальный компоновщикQVBoxLayout *verticalLayout; // вертикальный компоновщикQLabel *label;// меткаQPushButton *Button;// кнопкаvoid setupUi(QWidget *win) // метод конструирования формы{if (win->objectName().isEmpty())win->setObjectName(QString::fromUtf8("win"));win->resize(254, 96);formLayout = new QFormLayout(win);formLayout->setSpacing(6);formLayout->setContentsMargins(11, 11, 11, 11);formLayout->setObjectName(QString::fromUtf8("formLayout"));verticalLayout = new QVBoxLayout();verticalLayout->setSpacing(6);verticalLayout->setObjectName(QString::fromUtf8("verticalLayout"));label = new QLabel(win);label->setObjectName(QString::fromUtf8("label"));verticalLayout->addWidget(label);button = new QPushButton(win);button->setObjectName(QString::fromUtf8("button"));verticalLayout->addWidget(button);formLayout->setLayout(0, QFormLayout::LabelRole,verticalLayout);retranslateUi(win);QObject::connect(button, SIGNAL(clicked()),win, SLOT(close()));QMetaObject::connectSlotsByName(win);} // setupUivoid retranslateUi(QWidget *win){win->setWindowTitle(QApplication::translate("win","Win", nullptr));label->setText(QApplication::translate("win","\"Hello!\"", nullptr));button->setText(QApplication::translate("win","Close", nullptr));} // retranslateUi};namespace Ui {class win: public Ui_win {};}QT_END_NAMESPACE // метка конца пространства имен Ui#endifQt Designer автоматически построил текст, близкий к тексту программы из раздела1.1.
Однако этот текст существенно длиннее и сложнее организован, что вызвано необходимостью предусмотреть в шаблоне различные варианты. Так, например, для организациисмены языка интерфейса в процессе работы программы все строки, которые должны бытьпереведены, собраны в одном специальном методе retranslateUi().Избыточность кода, генерируемого Qt Designer, является причиной того, что данныйпакет обычно используют для быстрого создания прототипа интерфейса, а для конечнойреализации интерфейсы создают вручную с использованием классов Qt.1.2.4 Интегрированная среда разработки Qt CreatorИнтегрированная среда Qt Creator обеспечивает весь процесс создания и отладкиприложений в операционных системах Linux, Mac OS X и Windows.Среда включает собственный специализированный редактор. В отличие от обычноготекстового редактора текстовый редактор Qt Creator предназначен для работы с исходными текстами программ, поэтому он: помогает форматировать код программы; обеспечивает режим подсказок при вводе кода; выполняет контроль ошибок; осуществляет навигацию по коду по классам, функциям и символам; предоставляет контекстно-зависимую справку по классам, функциям и символам; при переименовании учитывает области действия идентификаторов; идентифицирует место в коде, где функция была описана или вызвана.Конструирование форм в среде можно выполнять вручную или с использованиемклона программы Qt Designer.
Компиляция-сборка приложения выполняется с помощьюС++ MinGW или Visual C++ в зависимости от настоек среды.Рассмотрим процесс проектирования приложений с использованием Qt Creator.При запуске среды Qt Creator на экране появляется окно Начало работы (рисунок1.15), которое содержит ссылки на учебники и примеры.Переключение режимов работы среды осуществляется с использованием левой панели окна, на которой статически расположены кнопки: Начало – переключает среду в режим Начало работы, используемый для вызовапримеров или создания новых проектов; Редактор – организует переключение в просмотр и редактирование исходных текстов программы; Дизайн – вызывает Дизайнер для создания/редактирования форм проекта; Отладка – используется при пошаговом проходе программы и при работе с точками останова; Проекты – предназначается для работы с несколькими проектами одновременно; Справка – организует работу со справочными сведениями, обеспечивая контекстный и обычный поиски информации.Рисунок 1.15 – Вид окна Начало работы среды QtCreatorПри использовании QtCreator приложение создается аналогично тому, как это делается в других средах, например в Delphi: разрабатываются формы окон (в QtDesigner или непосредственно в коде программы); выполняется описание классов этих окон (автоматически или вручную); описываются методы классов окон и основная программа; выполняется тестирование и отладка полученной программы.Примечание.
При создании приложения с использованием QtDesigner среда QtCreator создает не только файл формы с расширением .ui, но и заготовку заголовка класса окна. При этом класс,автоматически описанный дизайнером, может, не только служить базовым для класса окна вместес QWidget, но и находиться с этим классом в отношениях композиции и наполнения, как указывалось ранее.Несмотря на более простой вариант с множественным наследованием, среда поумолчанию предлагает вариант композиции класса окна и автоматически созданногокласса.ДляперенастройкивыбираемпунктменюИнструменты\Параметры\Дизайнер… и устанавливаем Множественное наследование (рисунок1.16).Рисунок 1.16 – Настройка отношения автоматически созданного и оконного классовПример 1.5.
Приложение Hello. Разработка с использованием Qt Creator.Создание нового проекта. Разработка приложения начинается, как и в других средах, с создания нового проекта. Проект создается при выборе пункта меню Файл\Новыйфайл или проект или при нажатии на кнопку Создать проект окна Начало работы (см.рисунок 1.14).При заказе создания проекта на экране появляются окна мастера создания проекта,на которых последовательно предлагается выбрать шаблон, местоположение, название,базовый класс окна, названия заголовочного файла и файла реализации класса и указать,предполагается ли использование Qt Designer для создания класса описания формы интерфейса, и, если да, то его имя.В соответствии с заданием мы выбираем шаблон GUI (Graphic User Interface – Графический интерфейс пользователя) приложение Qt (см. рисунок 1.17), заказываем создание окна с применением Qt Designer и подтверждаем все автоматически сгенерированныеимена.Рисунок 1.17 – Первое из последовательности окон задания характеристик проектаВ результате получаем заготовку проекта, которая включает следующие исходныефайлы: Hello.pro – файл проекта; main.cpp – файл основной программы; widget.h – заголовочный файл класса окна (заготовка этого файла создается автоматически); widget.cpp – файл реализации класса окна; widget.ui – редактируемый в Qt Designer файл описания класса образа окна.Аналогично другим средам разработки заготовку можно запускать на выполнение.При этом на экране появится пустое окно с обычным набором кнопок (см.
рисунок 1.18).Файл проекта заготовки уже настроен для работы со всеми файлами проекта:QT+= core guiTARGET =TEMPLATE = appSOURCES += main.cpp\widget.cppHEADERS += widget.hFORMS+= widget.uiРисунок 1.18 – Окно заготовки приложенияФайл заголовка окна widget.h содержит минимальное описание класса окна,наследуемого от двух классов QWidget и автоматически созданного дизайнером классаобраза окна Widget:#ifndef WIDGET_H#define WIDGET_H#include "ui_widget.h"class Widget : public QWidget, private Ui::Widget{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);};#endif // WIDGET_HФайл реализации класса widget.cpp содержит только вызов метода построения образа окна:#include "widget.h"Widget::Widget(QWidget *parent): QWidget(parent){setupUi(this); // построение образа окна}Основная программа main.cpp в заготовке создает объект-приложение a и окно w,визуализирует окно и запускает цикл обработки сообщений:#include <QtGui/QApplication>#include "widget.h"int main(int argc, char *argv[]){QApplication a(argc, argv);Widget w;w.show();return a.exec();}Создание образа окна.