Qt5学习笔记(消息过滤器)
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

欢迎交流。
Qt5学习笔记(消息过滤器)的更多相关文章
- Storm学习笔记 - 消息容错机制
Storm学习笔记 - 消息容错机制 文章来自「随笔」 http://jsynk.cn/blog/articles/153.html 1. Storm消息容错机制概念 一个提供了可靠的处理机制的spo ...
- Qt5学习笔记(1)-环境配置(win+64bit+VS2013)
Qt5学习笔记(1)-环境配置 工欲善其事必先-不装-所以装软件 久不露面,赶紧打下酱油. 下载 地址:http://download.qt.io/ 这个小网页就可以下载到跟Qt有关的几乎所有大部分东 ...
- objc_msgSend消息传递学习笔记 – 消息转发
该文是 objc_msgSend消息传递学习笔记 – 对象方法消息传递流程 的基础上继续探究源码,请先阅读上文. 消息转发机制(message forwarding) Objective-C 在调用对 ...
- day68—angularJS学习笔记之-过滤器
转行学开发,代码100天——2018-05-23 今天学习angularJS的过滤器的使用. angular中的常用过滤器用来修改数据格式,主要有以下几类: 1.大写,| uppercase 2.小写 ...
- Qt5学习笔记(消息基础)
#include "MyWidget.h" #include <QApplication> #include <QEvent> #include <Q ...
- 学习笔记_过滤器详细(过滤器JavaWeb三大组件之一)
过滤器详细 1 过滤器的生命周期 我们已经学习过Servlet的生命周期,那么Filter的生命周期也就没有什么难度了! (l) init(FilterConfig):在服务器启动时会创建Filte ...
- Javaweb学习笔记9—过滤器
今天来讲javaweb的第9阶段学习. 过滤器,我在本次的思维导图中将过滤器和监听器放在一起总结了,监听器比较简单就不单独写了. 老规矩,首先先用一张思维导图来展现今天的博客内容. ...
- VBA 学习笔记 - 消息框
学习资料:https://www.yiibai.com/vba/vba_macro_comments.html 注释 单引号或 REM 开头 丸子:多行注释咋办? 消息框(MsgBox) 函数功能:显 ...
- 学习笔记_过滤器应用(粗粒度权限控制(拦截是否登录、拦截用户名admin权限))
RBAC ->基于角色的权限控制 l tb_user l tb_role l tb_userrole l tb_menu(增.删.改.查) l tb_rolemenu 1 说明 我们给 ...
随机推荐
- 迷你MVVM框架 avalonjs 1.2.5发布
avalon1.2.5发布,升级ms-widget,整合avalon.require.text到核心,并且修复了avalon.mobile的avalon.innerHTML方法的BUG,让它能执行脚本 ...
- hadoop之HDFS学习笔记(二)
主要内容:hdfs的核心工作原理:namenode元数据管理机制,checkpoint机制:数据上传下载流程 1.hdfs的核心工作原理 1.1.namenode元数据管理要点 1.什么是元数据? h ...
- java常量池与对象存储
一 数据存储位置 我们先来谈谈数据的存储位置,有五个地方可以存储数据 (1)寄存器:这是最快的存储区,因为它位于不同于其他存储区的地方- ...
- 20172325 2018-2019-2 《Java程序设计》第三周学习总结
20172325 2018-2019-2 <Java程序设计>第三周学习总结 教材学习内容总结 一.什么是队列? 队列是一种线性集合,其元素从一端加入,从另一端删除: 队列的元素按照FIF ...
- KbmMW 4.40.00 正式版发布
经过快3个月的测试,kbmmw 4.40 正式版终于在圣诞节前发布了. We are happy to announce the availability of a new kbmMW release ...
- 服务器上如何再另外添加一个E盘
我的电脑按右键,选择管理..然后在左边选择磁盘管理,然后对着C盘或者D盘按右键,选择压缩卷,等一下下,就会出现个框框让你选择压缩多少,然后多了一个可用空间,再把它分成一个分区就OK拉 步骤:对可用空间 ...
- Monokai风格的EditPlus配色方案
EditPlus的配置文件editplus_u.ini,该文件默认在:系统盘:\Users\用户名\AppData\Roaming\EditPlus目录中.将其中的内容替换为如下即可: [Option ...
- nodename nor servname provided, or not known
mac来使用redis然后产生上述错误,据说是用户名的问题 解决: 打开终端: cat /private/etc/hosts sudo vi /private/etc/hosts 将错误的那个名字加入 ...
- (全排列)Ignatius and the Princess II -- HDU -- 1027
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1027 Ignatius and the Princess II Time Limit: 2000/100 ...
- SpringBoot学习:整合shiro自动登录功能(rememberMe记住我功能)
首先在shiro配置类中注入rememberMe管理器 /** * cookie对象; * rememberMeCookie()方法是设置Cookie的生成模版,比如cookie的name,cooki ...