cpp

ООП-стиль создания окна

Библиотека Qt написана в объектно-ориентированном стиле (ООП-стиле) и содержит более 600 классов. Иерархия наследования всех классов имеет слишком большой размер, поэтому приводить ее в книге нет возможности. Тем не менее, чтобы показать зависимости, при описании компонентов иерархия наследования конкретного класса будет показываться. В качестве примера выведем базовые классы для класса QWidget:

(QObject, QPaintDevice) — QWidget

Как видно из примера, класс QWidget наследует два класса — QObject и QPaintDevice. Класс QObject является классом верхнего уровня, его наследуют большинство классов в Qt. В свою очередь класс QWidget является базовым классом для всех визуальных компонентов. Таким образом, класс QWidget наследует все свойства и методы базовых классов. Это обстоятельство следует учитывать при изучении документации, так как в ней описываются свойства и методы конкретного класса, а на унаследованные свойства и методы даются только ссылки.

В своих программах вы можете наследовать стандартные классы и добавлять новую функциональность. При создании проекта мастер автоматически создал файлы widget.h и widget.cpp, давайте ими воспользуемся и создадим окно в ООП-стиле. Содержимое файла widget.h приведено в листинге 1.3, файла widget.cpp — в листинге 1.4, а файла main.cpp — в листинге 1.5.

Листинг 1.3. Содержимое файла C:\cpp\projectsQt\Test\widget.h

#ifndef WIDGET_H
#define WIDGET_H

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

class Widget : public QWidget
{
   Q_OBJECT

public:
   Widget(QWidget *parent=nullptr);
   ~Widget();

private:
   QLabel *label;
   QPushButton *btnQuit;
   QVBoxLayout *vbox;
};
#endif // WIDGET_H

Листинг 1.4. Содержимое файла C:\cpp\projectsQt\Test\widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent)
   : QWidget(parent)
{
   label = new QLabel("Привет, мир!");
   label->setAlignment(Qt::AlignCenter);
   btnQuit = new QPushButton("&Закрыть окно");
   vbox = new QVBoxLayout();
   vbox->addWidget(label);
   vbox->addWidget(btnQuit);
   setLayout(vbox);
   connect(btnQuit, SIGNAL(clicked()),
           qApp, SLOT(quit()));
}

Widget::~Widget()
{
}

Листинг 1.5. Содержимое файла C:\cpp\projectsQt\Test\main.cpp

#include "widget.h"

int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
   Widget window;
   window.setWindowTitle("ООП-стиль создания окна");
   window.resize(350, 70);
   window.show();
   return app.exec();
}

Итак, сначала в файле widget.h подключаются заголовочные файлы. Затем идет объявление класса Widget, который наследует класс QWidget:

class Widget : public QWidget

Помимо класса QWidget можно наследовать и другие классы, которые являются наследниками класса QWidget, например, класс QFrame (окно с рамкой) или QDialog (диалоговое окно). При наследовании класса QDialog окно будет выравниваться по центру экрана (или по центру родительского окна) и иметь только две кнопки в заголовке окна — Справка и Закрыть. Кроме того, можно наследовать класс QMainWindow, который представляет главное окно приложения с меню, панелями инструментов и строкой состояния. Наследование класса QMainWindow имеет свои отличия, которые мы будем рассматривать в отдельной главе.

Обратите внимание на макрос Q_OBJECT. Его обязательно нужно указывать для всех классов, наследующих класс QObject.

Объявление конструктора класса имеет следующий прототип:

Widget(QWidget *parent=nullptr);

В качестве параметра конструктор принимает указатель на родительский компонент (parent). Родительский компонент может отсутствовать, поэтому в определении конструктора параметру присваивается значение по умолчанию (nullptr). В файле widget.cpp сначала вызывается конструктор базового класса и ему передается ссылка на родительский компонент:

Widget::Widget(QWidget *parent)
   : QWidget(parent)

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

Далее производится назначение обработчика нажатия кнопки:

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

В отличие от предыдущего примера (см. листинг 1.2), метод connect() вызывается не через класс QObject, а через экземпляр нашего класса. Это возможно, так как мы наследовали класс QWidget, который в свою очередь является наследником класса QObject и наследует метод connect(). Еще одно отличие состоит в обращении к объекту приложения через макрос qApp.

В предыдущем примере (листинг 1.2) мы выравнивали надпись с помощью HTML-разметки. Произвести аналогичную операцию позволяет также метод setAlignment(), которому следует передать константу Qt::AlignCenter:

label->setAlignment(Qt::AlignCenter);

В некоторых случаях использование ООП-стиля является обязательным. Например, чтобы обработать нажатие клавиши на клавиатуре, необходимо наследовать какой-либо класс и переопределить в нем метод с предопределенным названием. Какие методы необходимо переопределять мы рассмотрим при изучении обработки событий.

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

Помощь сайту

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

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

cpp