Предотвращение закрытия окна

При нажатии кнопки Закрыть в заголовке окна или при вызове метода close() вызывается метод closeEvent(). Прототип метода:

virtual void closeEvent(QCloseEvent *event)

Через параметр доступен экземпляр класса QCloseEvent. Чтобы предотвратить закрытие окна необходимо вызвать метод ignore() через объект события, в противном случае — метод accept().

В качестве примера при нажатии кнопки Закрыть в заголовке окна выведем стандартное диалоговое окно с запросом подтверждения закрытия окна. Если пользователь нажимает кнопку Yes, то закроем окно, а если кнопку No или просто закрывает диалоговое окно, то прервем закрытие окна. Содержимое файла widget.h приведено в листинге 4.27, файла widget.cpp — в листинге 4.28, а файла main.cpp — в листинге 4.29.

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

#ifndef WIDGET_H
#define WIDGET_H

#include <QApplication>
#include <QWidget>
#include <QCloseEvent>
#include <QMessageBox>

class Widget : public QWidget
{
   Q_OBJECT

public:
   Widget(QWidget *parent=nullptr);
   ~Widget();
protected:
  void closeEvent(QCloseEvent *e) override;
};
#endif // WIDGET_H

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

#include "widget.h"

Widget::Widget(QWidget *parent)
   : QWidget(parent)
{}

void Widget::closeEvent(QCloseEvent *e)
{
   QMessageBox::StandardButton result;
   result = QMessageBox::question(this,
               "Подтверждение закрытия окна",
               "Вы действительно хотите закрыть окно?",
               QMessageBox::Yes | QMessageBox::No,
               QMessageBox::No);
   if (result == QMessageBox::Yes) {
      e->accept();
      QWidget::closeEvent(e);
   }
   else {
      e->ignore();
   }
}

Widget::~Widget() {}

Листинг 4.29. Содержимое файла 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
Скриншот реквизитов