Этот сайт использует cookies. Продолжение работы с сайтом означает, что Вы согласны!
ООП-стиль создания окна
Библиотека 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);
В некоторых случаях использование ООП-стиля является обязательным. Например, чтобы обработать нажатие клавиши на клавиатуре, необходимо наследовать какой-либо класс и переопределить в нем метод с предопределенным названием. Какие методы необходимо переопределять мы рассмотрим при изучении обработки событий.
Помощь сайту
ЮMoney (Yandex-деньги): 410011140483022
ПАО Сбербанк:
Счет: 40817810855006152256
Реквизиты банка:
Наименование: СЕВЕРО-ЗАПАДНЫЙ БАНК ПАО СБЕРБАНК
Корреспондентский счет: 30101810500000000653
БИК: 044030653
КПП: 784243001
ОКПО: 09171401
ОКОНХ: 96130
Скриншот реквизитов