当前位置: 首页 > news >正文

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);
}

相关文章:

  • StartUML4.0.1的使用方法
  • 结构型模式--Proxy代理模式
  • C++的Lambda表达式的用法
  • 微信小程序学习之rich-text的嵌入静态HTML
  • 微信小程序CSS Flexbox(弹性盒子)布局模块
  • 语义化版本 2.0.0 -- 如何使用软件版本号
  • 微信小程序css之盒子(box)模型
  • 微信小程序中text标签换行问题
  • 微信小程序无法找到组件的问题 [“usingComponents“][“component1“]:“xxx“未找到
  • git本地仓库新建分支并推送到远端仓库
  • 微信小程序将组件中的文字放置在正中间的方法
  • linux脚本开头的#!/bin/bash有什么作用
  • git如何撤销未提交的更改
  • Qt动态更改界面语言(在运行状态下改变界面语言)
  • .gitignore文件---让git自动忽略指定文件
  • 实现windows 窗体的自己画,网上摘抄的,学习了
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 【跃迁之路】【463天】刻意练习系列222(2018.05.14)
  • Akka系列(七):Actor持久化之Akka persistence
  • Android框架之Volley
  • classpath对获取配置文件的影响
  • Docker入门(二) - Dockerfile
  • es6--symbol
  • Git学习与使用心得(1)—— 初始化
  • java小心机(3)| 浅析finalize()
  • vue-router的history模式发布配置
  • 机器学习学习笔记一
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 使用agvtool更改app version/build
  • Nginx实现动静分离
  • 仓管云——企业云erp功能有哪些?
  • ​2020 年大前端技术趋势解读
  • # C++之functional库用法整理
  • #includecmath
  • (145)光线追踪距离场柔和阴影
  • (done) NLP “bag-of-words“ 方法 (带有二元分类和多元分类两个例子)词袋模型、BoW
  • (Matlab)使用竞争神经网络实现数据聚类
  • (接口封装)
  • (七)Knockout 创建自定义绑定
  • (三维重建学习)已有位姿放入colmap和3D Gaussian Splatting训练
  • (四) Graphivz 颜色选择
  • (四)图像的%2线性拉伸
  • (五) 一起学 Unix 环境高级编程 (APUE) 之 进程环境
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一)搭建springboot+vue前后端分离项目--前端vue搭建
  • (译)2019年前端性能优化清单 — 下篇
  • *Algs4-1.5.25随机网格的倍率测试-(未读懂题)
  • .gitignore文件---让git自动忽略指定文件
  • .NET Core/Framework 创建委托以大幅度提高反射调用的性能
  • .net core使用RPC方式进行高效的HTTP服务访问
  • .NET Framework杂记
  • .NET WebClient 类下载部分文件会错误?可能是解压缩的锅
  • .net websocket 获取http登录的用户_如何解密浏览器的登录密码?获取浏览器内用户信息?...
  • /deep/和 >>>以及 ::v-deep 三者的区别
  • []指针