Qt实现关闭主/父窗口后同时关闭其他窗口的方法事件过滤器(eventFilter)的使用
实现的方式是使用Qt的事件过滤器,捕捉到主窗口关闭事件,调用系统退出函数(quit())停止程序运行。
使用事件过滤器的步骤如下:
1. 在需要用到的类中实现下面的函数。
bool QObject::eventFilter(QObject *watched, QEvent *event)
watched表示被监控的对象,event中存储了本次发生的事件。
2. 在被监控的对象上调用installfilter函数注册过滤器
#monitorObj为被监控的对象,filterObj是实现了过滤器(eventFilter函数)的对象
monitoredObj->installEventFilter(filterObj);
示例代码如下,在MainWindow中实现了事件过滤器,被监控对象也为MainWindow,所以此处为MainWindow注册过滤器参数使用this。事件过滤器中实现了主窗口关闭同时关闭其他窗口的功能。
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QMainWindow>
#include <QDialog>
#include <QWidget>
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
QDialog *dialog;
QWidget *widget;
protected:
bool eventFilter(QObject *obj, QEvent *ev);
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include <QEvent>
#include <QApplication>
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
setWindowTitle("MainWindow");
dialog = new QDialog(this);
dialog->setWindowTitle("dialog");
dialog->show();
widget = new QWidget();
widget->setWindowTitle("widget");
widget->show();
/* 被监控对象为MainWindow窗口,为其注册事件过滤器 */
this->installEventFilter(this);
}
MainWindow::~MainWindow()
{
delete dialog;
delete widget;
}
bool MainWindow::eventFilter(QObject *obj, QEvent *ev)
{
/*判断发生事件的是否为主窗口*/
if(obj==this) {
/*判断事件的类型是否为关闭事件*/
if (ev->type() == QEvent::Close){
qApp->quit();//主窗口关闭事件,程序退出,其他窗口将被关闭
return true; //返回true代表事件已被处理不需要向下传递,返回false代表事件未被处理需要向下传递由别的组件处理
}
}
/*不是我们关心的事件,交由QMainWindow的事件过滤器处理*/
return QMainWindow::eventFilter(obj, ev);
}