События окна

Перехватывать все события следует только в самом крайнем случае. В обычных ситуациях нужно использовать методы, предназначенные для обработки определенного события, например, чтобы обработать закрытие окна достаточно переопределить метод closeEvent(). Какие методы требуется переопределять для обработки событий окна мы сейчас и рассмотрим.

Изменение состояния окна

Отследить изменение состояния окна (сворачивание, разворачивание, сокрытие и отображение) позволяют следующие методы:

  • changeEvent() — вызывается при изменении состояния окна, приложения или компонента. Иными словами, метод вызывается не только при изменении статуса окна, но и при изменении заголовка окна, палитры, статуса активности окна верхнего уровня, языка, локали и др. (полный список смотрите в документации). При обработке события WindowStateChange через параметр доступен экземпляр класса QWindowStateChangeEvent. Этот класс содержит только метод oldState(), с помощью которого можно получить предыдущий статус окна. Прототипы методов:
virtual void changeEvent(QEvent *event)
Qt::WindowStates oldState() const
  • showEvent() — вызывается при отображении компонента. Через параметр доступен экземпляр класса QShowEvent. Прототип метода:
virtual void showEvent(QShowEvent *event)
  • hideEvent() — вызывается при сокрытии компонента. Через параметр доступен экземпляр класса QHideEvent. Прототип метода:
virtual void hideEvent(QHideEvent *event)

Для примера выведем текущее состояние окна в консоль при сворачивании, разворачивании, сокрытии и отображении окна. Содержимое файла widget.h приведено в листинге 4.21, файла widget.cpp — в листинге 4.22, а файла main.cpp — в листинге 4.23.

Листинг 4.21. Содержимое файла widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QApplication>
#include <QWidget>
#include <QShowEvent>
#include <QHideEvent>
#include <QPushButton>
#include <QVBoxLayout>

class Widget : public QWidget
{
   Q_OBJECT

public:
   Widget(QWidget *parent=nullptr);
   ~Widget();
protected:
   void changeEvent(QEvent *e) override;
   void showEvent(QShowEvent *e) override;
   void hideEvent(QHideEvent *e) override;
private:
   QPushButton *btn1;
   QPushButton *btn2;
   QVBoxLayout *vbox;
};
#endif // WIDGET_H

Листинг 4.22. Содержимое файла widget.cpp

#include "widget.h"

Widget::Widget(QWidget *parent)
   : QWidget(parent)
{
   btn1 = new QPushButton("Полноэкранный режим");
   btn2 = new QPushButton("Нормальный режим");
   vbox = new QVBoxLayout();
   vbox->addWidget(btn1);
   vbox->addWidget(btn2);
   setLayout(vbox);
   QObject::connect(btn1, SIGNAL(clicked()),
                    this, SLOT(showFullScreen()));
   QObject::connect(btn2, SIGNAL(clicked()),
                    this, SLOT(showNormal()));
}

void Widget::changeEvent(QEvent *e)
{
   if (e->type() == QEvent::WindowStateChange) {
      if (isMinimized()) {
         qDebug() << "Окно свернуто";
      }
      else if (isMaximized()) {
         qDebug() << "Окно раскрыто до максимальных размеров";
      }
      else if (isFullScreen()) {
         qDebug() << "Полноэкранный режим";
      }
      else if (isActiveWindow()) {
         qDebug() << "Окно находится в фокусе ввода";
      }
   }
   QWidget::changeEvent(e); // Отправляем дальше
}

void Widget::showEvent(QShowEvent *e)
{
   qDebug() << "Окно отображено";
   QWidget::showEvent(e); // Отправляем дальше
}

void Widget::hideEvent(QHideEvent *e)
{
   qDebug() << "Окно скрыто";
   QWidget::hideEvent(e); // Отправляем дальше
}

Widget::~Widget() {}

Листинг 4.23. Содержимое файла main.cpp

#include "widget.h"

int main(int argc, char *argv[])
{
   QApplication app(argc, argv);
   Widget window;
   window.setWindowTitle("Отслеживание состояния окна");
   window.resize(350, 100);
   window.show();
   return app.exec();
}

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

Помощь сайту

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

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