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学习笔记(消息过滤器)的更多相关文章

  1. Storm学习笔记 - 消息容错机制

    Storm学习笔记 - 消息容错机制 文章来自「随笔」 http://jsynk.cn/blog/articles/153.html 1. Storm消息容错机制概念 一个提供了可靠的处理机制的spo ...

  2. Qt5学习笔记(1)-环境配置(win+64bit+VS2013)

    Qt5学习笔记(1)-环境配置 工欲善其事必先-不装-所以装软件 久不露面,赶紧打下酱油. 下载 地址:http://download.qt.io/ 这个小网页就可以下载到跟Qt有关的几乎所有大部分东 ...

  3. objc_msgSend消息传递学习笔记 – 消息转发

    该文是 objc_msgSend消息传递学习笔记 – 对象方法消息传递流程 的基础上继续探究源码,请先阅读上文. 消息转发机制(message forwarding) Objective-C 在调用对 ...

  4. day68—angularJS学习笔记之-过滤器

    转行学开发,代码100天——2018-05-23 今天学习angularJS的过滤器的使用. angular中的常用过滤器用来修改数据格式,主要有以下几类: 1.大写,| uppercase 2.小写 ...

  5. Qt5学习笔记(消息基础)

    #include "MyWidget.h" #include <QApplication> #include <QEvent> #include <Q ...

  6. 学习笔记_过滤器详细(过滤器JavaWeb三大组件之一)

    过滤器详细 1 过滤器的生命周期 我们已经学习过Servlet的生命周期,那么Filter的生命周期也就没有什么难度了! (l)  init(FilterConfig):在服务器启动时会创建Filte ...

  7. Javaweb学习笔记9—过滤器

      今天来讲javaweb的第9阶段学习.   过滤器,我在本次的思维导图中将过滤器和监听器放在一起总结了,监听器比较简单就不单独写了.   老规矩,首先先用一张思维导图来展现今天的博客内容.     ...

  8. VBA 学习笔记 - 消息框

    学习资料:https://www.yiibai.com/vba/vba_macro_comments.html 注释 单引号或 REM 开头 丸子:多行注释咋办? 消息框(MsgBox) 函数功能:显 ...

  9. 学习笔记_过滤器应用(粗粒度权限控制(拦截是否登录、拦截用户名admin权限))

    RBAC ->基于角色的权限控制 l  tb_user l  tb_role l  tb_userrole l  tb_menu(增.删.改.查) l  tb_rolemenu 1 说明 我们给 ...

随机推荐

  1. 容器网络之 veth设备

    创建命名空间 # ip netns add mhc # ip link show1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue ...

  2. leetcode: Longest Valid Parentheses分析和实现

    题目大意:给出一个只包含字符'('和')'的字符串S,求最长有效括号序列的长度. 很有趣的题目,有助于我们对这种人类自身制定的规则的深入理解,可能我们大多数人都从没有真正理解过怎样一个括号序列是有效的 ...

  3. Redhat 启动mysql失败及重置密码

    cd usr/local/mysql/mysql5.6/bin [root@iZ2ze6yx6b47rdx0vccs5iZ bin]# service mysql-libs-5.1.73-8.el6_ ...

  4. 模板模式c#(非常简单,但又非常简洁好玩)

    using System;using System.Collections.Generic;using System.Linq;using System.Text; namespace 模板模式{   ...

  5. struts2 action result type类型

    struts2 action result type类型 1.chain:用来处理Action链,被跳转的action中仍能获取上个页面的值,如request信息. com.opensymphony. ...

  6. cmake 语法

    语法说明 CMakeLists.txt 文件遵循一种简单的语法包括 注释,命令和空格字符.注释使用#符号,从符号开始之后的一行都表示注释.命令包括命令名,左括号,分隔参数的空白字符和右括号.命令既可以 ...

  7. Word2007发布博客

    目前大部分的博客作者在用Word写博客这件事情上都会遇到以下3个痛点: 1.所有博客平台关闭了文档发布接口,用户无法使用Word,Windows Live Writer等工具来发布博客.使用Word写 ...

  8. openGL中的原理理解1---一个视图需要支持OGL需要配置,GLenbalView的理解

    OpenGL的绘图机制是 OpenGL的绘图方式与Windows一般的绘图方式是不同的,主要区别如下: (1)Windows采用的是GDI(Graphy Device Interface 图形设备接口 ...

  9. 机器学习—K近邻

    一.算法原理 还是图片格式~ 二.sklearn实现 import pandas as pd import numpy as np import matplotlib.pyplot as plt im ...

  10. 简述负载均衡和CDN技术

    曾经见到知乎上有人问“为什么像facebook这类的网站需要上千个工程师维护?”,下面的回答多种多样,但总结起来就是:一个高性能的web系统需要从无数个角度去考虑他,大到服务器的布局,小到软件中某个文 ...