T06EventFilter.pro

 HEADERS += \
MyWidget.h SOURCES += \
MyWidget.cpp QT += widgets gui

MyWidget.h

 #ifndef MYWIDGET_H
#define MYWIDGET_H #include <QWidget>
#include <QPushButton>
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = nullptr);
QPushButton* _button;
bool eventFilter(QObject *, QEvent *);//原型
signals: public slots:
}; #endif // MYWIDGET_H

MyWidget.cpp

 #include "MyWidget.h"
#include <QPushButton>
#include <QEvent>
MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
QPushButton* button;
button = new QPushButton("This button", this);
connect(button, SIGNAL(clicked()), this, SLOT(close())); _button = button;
/*button给自己安装了一个消息过滤器,经过button的消息,都先要调用它的过滤器eventFilter函数*/
button->installEventFilter(this);
} bool MyWidget::eventFilter(QObject *o, QEvent *e)//o谁的,e什么消息(对象,事件)
{ //(对象,事件)
if (o == (QObject*)_button &&
(e->type() == QEvent::MouseButtonPress ||
e->type() == QEvent::MouseButtonRelease ||
e->type() == QEvent::MouseButtonRelease ))//截断,单击,双击,不发生反应
{
return true;
} return QWidget::eventFilter(o, e);
}
#include <QApplication>
int main(int argc, char* argv[])
{
QApplication app(argc, argv); MyWidget w;
w.show(); return app.exec();
}

消息被过滤,单击,双击都没有反应。

如果将17~26行注释,单击按钮后,窗口立即消失。

notify:

MyApplication.h

 #ifndef MYAPPLICATION_H
#define MYAPPLICATION_H #include <QApplication> class MyApplication : public QApplication
{
Q_OBJECT
public: MyApplication(int argc, char* argv[]):QApplication(argc, argv)
{}
bool notify(QObject *, QEvent *);
signals: public slots:
}; #endif // MYAPPLICATION_H

MyWidget.h

 #ifndef MYWIDGET_H
#define MYWIDGET_H #include <QWidget>
#include <QPushButton>
class MyWidget : public QWidget
{
Q_OBJECT
public:
explicit MyWidget(QWidget *parent = nullptr);
QPushButton* _button;
bool eventFilter(QObject *, QEvent *);//原型
bool event(QEvent *);//重载event函数
signals: public slots:
}; #endif // MYWIDGET_H

MyApplication.cpp

 #include "MyApplication.h"
#include <QEvent>
#include <QDebug> bool MyApplication::notify(QObject *o, QEvent *e)
{
if (this->topLevelWidgets().count()>)//判断子窗口是否存在
{
QWidget* mainWnd = this->topLevelWidgets().at();//主窗口不在了,还会notify,会报错,需先判断
if (o == (QObject*)mainWnd && e->type() == QEvent::MouseButtonPress)
{
qDebug() << "mainwnd is clicked";
}
}
return QApplication::notify(o, e);
}

MyWidget.cpp

 #include "MyWidget.h"
#include <QPushButton>
#include <QEvent>
#include "MyApplication.h"
#include <QDebug>
MyWidget::MyWidget(QWidget *parent) : QWidget(parent)
{
QPushButton* button;
button = new QPushButton("This button", this);
connect(button, SIGNAL(clicked()), this, SLOT(close())); _button = button;
/*button给自己安装了一个消息过滤器,经过button的消息,都先要调用它的过滤器eventFilter函数*/
button->installEventFilter(this);
} bool MyWidget::eventFilter(QObject *o, QEvent *e)//o谁的,e什么消息(对象,事件)
{ //(对象,事件)
if (o == (QObject*)_button &&
(e->type() == QEvent::MouseButtonPress ||
e->type() == QEvent::MouseButtonRelease ||
e->type() == QEvent::MouseButtonRelease ))//截断,单击,双击,不发生反应
{
return true;
} return QWidget::eventFilter(o, e);
} bool MyWidget::event(QEvent *e)
{
if (e->type() == QEvent::User)
{
qDebug() << "User event is comming";
}
return QWidget::event(e);
} int main(int argc, char* argv[])
{
MyApplication app(argc, argv); MyWidget w;
w.show();
//发送一个Event给MyWidget
qDebug() << "begin send";
//发给自定义消息给窗口
app.postEvent(&w, new QEvent(QEvent::User));//不是立刻处理,加入消息队列等待处理,常用
app.sendEvent(&w, new QEvent(QEvent::User));//立即处理
qDebug() << "end send"; return app.exec();
}

运行后

第一个User event is comming来自于sendEvent函数,第二个来自于postEvent。

点击主窗口时输出mainwnd is clicked

欢迎交流。

最新文章

  1. 关于php的一些小知识!
  2. Web Server 配置及上传文件
  3. (转)从工程中删除Cocoapods
  4. http://localhost:8080/ 演出Oracle说明
  5. NYoj 部分和问题(深搜经典)
  6. 本地Fiddler传递XML格式数据,调试微信功能。
  7. 高级映射,查询缓存和与spring整合
  8. 斐讯 FIR151M 频繁掉线(OpenWRT解决方案)
  9. sso系统使用
  10. Vue 进阶之路(一)
  11. Shell入门及实践
  12. 编码(2)从字节理解Unicode(UTF8/UTF16)
  13. Arrays.asList() 的使用注意
  14. windows云服务器数据迁移
  15. 【PHP面试题】通俗易懂的两个面试必问的排序算法讲解:冒泡排序和快速排序
  16. ext2文件系统学习(二)—— 目录磁盘结构
  17. 虹软2.0免费离线人脸识别 Demo [C++]
  18. 真实的物理机安装Centos7系统后网卡只有lo没有eno1的解决办法:实际上是物理机未安装网驱动卡
  19. liblas 1.8.1编译安装
  20. STM32 SPI接口的NSS引脚

热门文章

  1. 代替Reflection(反射)的一些方法(转)
  2. springmvc 类型转换器 数据回显及提示信息
  3. gradle 构建测试
  4. FineUI学习
  5. JavaScript RegExp.test() 方法
  6. 前端基础之:JQuery
  7. Redis通用命令(七)
  8. 五)Spring + Quartz 复杂业务的两个问题:获取Spring上下文 和 自动注入服务类
  9. ubuntu解压文件命令大全
  10. [label][转载][paypal]paypal在线支付接口的WEB语言设置