【Qt 拦截消息的五种方法】

  1. 覆写框架类QCoreApplication的notify函数,这个函数将得到整个框架中所有窗口的消息
  2. 给框架类安装一个消息过滤器 QCoreApplication->nativeEventFilter(filterObj),这种我们代码没有实现
  3. 给某窗口安装一个消息过滤器 QPushButton->installEventFilter(filterObj)
  4. 继承某窗口并覆写event函数(该函数负责某个窗口中派发所有子消息)
  5. 继承某窗口并覆写窗口的某个子消息

以上介绍的几种方法结构图如下:

【代码示例】

下面代码演示了上面介绍的 1、3、4、5 四种方法,由于第二种非常难演示并且与第一种功能类似,所以我们没有做示例。

代码一共分7个文件:

  1. capplication.h:继承 QApplication 的类 CApplication 类
  2. capplication.cpp:继承 QApplication 的类 CApplication 类的功能实现
  3. cpushbutton.h:继承 QPushButton 的类 CPushButton 类
  4. cpushbutton.cpp:继承 QPushButton 的类 CPushButton 类的功能实现
  5. cwidget.h:继承 QWidget 的类 CWidget 类
  6. cwidget.cpp:继承 QWidget 的类 CWidget 类的实现
  7. main.cpp:实例化框架和窗口对象并显示窗口
#ifndef CAPPLICATION_H
#define CAPPLICATION_H#include <QApplication>
#include <QDebug>class CApplication : public QApplication
{
public:CApplication(int argc, char* argv[]);bool notify(QObject *, QEvent *);
};#endif // CAPPLICATION_H
#include "capplication.h"CApplication::CApplication(int argc, char* argv[]):QApplication(argc, argv)
{}bool CApplication::notify(QObject *obj, QEvent *ev)
{// 根据窗口名字判断是否是 CWidget 窗口类的消息if (obj->objectName() == "widgets"){// 判断消息类型是不是鼠标点击消息if (ev->type() == QEvent::MouseButtonPress){qDebug() << "在窗口中点击了鼠标!";}}// 将消息交还给父窗口处理,避免消息丢失QApplication::notify(obj, ev);
}
#ifndef CPUSHBUTTON_H
#define CPUSHBUTTON_H#include <QPushButton>
#include <QDebug>
#include <QMouseEvent>class CPushButton : public QPushButton
{
public:CPushButton();void mousePressEvent(QMouseEvent *e);void mouseReleaseEvent(QMouseEvent *e);};#endif // CPUSHBUTTON_H
#include "cpushbutton.h"CPushButton::CPushButton()
{}void CPushButton::mousePressEvent(QMouseEvent *e)
{qDebug() << "截获鼠标按下消息...";// 因为最底层的消息没有返回值// 可以调用accept函数告知父类已经处理过该消息e->accept();
}void CPushButton::mouseReleaseEvent(QMouseEvent *e)
{qDebug() << "截获鼠标弹起消息...";// 表示对此消息不感兴趣,交由父类的消息处理函数去处理。// 实际我们已经在这个消息处理函数中打印了一句话// 这样父类、子类都会对这个消息做处理e->ignore();
}
#ifndef CWIDGET_H
#define CWIDGET_H#include <QWidget>
#include <QObject>
#include <QEvent>
#include "cpushbutton.h"class CWidget : public QWidget
{Q_OBJECT
public:explicit CWidget(QWidget *parent = 0);CPushButton* _button;bool eventFilter(QObject *, QEvent *);signals:public slots:
};#endif // CWIDGET_H
#include "cwidget.h"CWidget::CWidget(QWidget *parent) : QWidget(parent)
{// 设置自身窗口的名字,好让父类可以识别这个窗口进行消息处理this->setObjectName("widgets");_button = new CPushButton;_button->setText("button");_button->setParent(this);_button->installEventFilter(this);
}bool CWidget::eventFilter(QObject *obj, QEvent *ev)
{// 判断对象是否是 button 对象if (obj == _button){// 判断消息是否是单击消息if (ev->type() == QEvent::MouseButtonPress){// 对鼠标单击处理...}}// 把消息交还给父类处理,这样消息就不会丢失QWidget::eventFilter(obj, ev);
}
#include "capplication.h"
#include "cwidget.h"int main(int argc, char* argv[])
{CApplication app(argc, argv);CWidget w;w.show();return app.exec();
}

Qt-窗口消息处理机制及拦截消息的五种方法相关推荐

  1. MFC实现从一个窗口向另一个窗口发送消息的两种方法

    实现从一个窗口向另一个窗口发送消息,使用过下面两种方法 /*方法一:通过用SDK的标准API来查找其他对话框窗口返回句柄,并且发送信息 HWND hWnd; //通过SDK的FindWindow函数得 ...

  2. 【Android基础】Android Toast显示消息的几种方法

    原文来自:http://blog.csdn.net/pku_android/article/details/7333145 Android中提供一种简单的Toast消息提示框机制,可以在用户点击了某些 ...

  3. 延迟消息的五种实现方案

    生产者把消息发送到消息队列中以后,并不期望被立即消费,而是等待指定时间后才可以被消费者消费,这类消息通常被称为延迟消息.延迟消息的应用场景其实是非常的广泛,比如以下的场景: 网上直播授课时,在课程开始 ...

  4. qt调用Linux脚本范例,QT下实现对Linux Shell调用的几种方法

    使用QProcess QThread ============================================ #include int main() { QProcess::exec ...

  5. qt连接mysql数据库原理_Qt连接数据库的两种方法

    我曾经想过,无论在哪个平台下开发,都不要再接触SQL Server了,但显然不行.我们是来看世界的,不是来改变世界的,想通就好. 前两天,尝试了一下Qt下远程访问数据库.在macOS下,用Qt 5.1 ...

  6. C#实现在Form上截取消息的两种方法

    比较常用的是重载Form的DefWndProc方法,例如截取鼠标按下的消息: protected override void DefWndProc(ref Message m) { if ( m.Ms ...

  7. java 登录过滤_Java 过滤器实现(登录) + 拦截器(两种方法)

    以下是实现未登录不能进入页面的实现 使用了thyemeleaf+SpringBoot+过滤器实现的,过滤器的核心代码如下: @Component @WebFilter(filterName= &quo ...

  8. linux QT 结束当前进程_Linux结束进程到底有多少种方法?

    请关注本头条号,每天坚持更新原创干货技术文章. 如需学习视频,请在微信搜索公众号"智传网优"直接开始自助视频学习. 1. 前言 我们经常在Linux里使用kill命令来结束某后台进 ...

  9. windows中使用钩子拦截消息

    一.前 言 众所周知,Windows程式的运行是依靠发生的事件来驱动.换句话说,程式不断等待一个消息的发生,然后对这个消息的类型进行判断,再做适当的处理.处理完此次消息后又回到等待状态.从上面对Win ...

最新文章

  1. swoole安装异步reids
  2. 收藏 | 一文洞悉Python必备50种算法(附解析)
  3. android中的tabdemo
  4. 一些常用jar包作用
  5. 实战OpenPose项目1:开篇使用文档
  6. 原理图符号(原理图库)创建流程及注意事项
  7. 在子页面控制父页面iframe的高度
  8. js使用双层for循环实现倒三角形、正三角形
  9. 为什么我玩游戏那么卡?
  10. Buffer简介与使用
  11. 在WSL上安装MuJoCo和mujoco_py
  12. 仿照登录界面实现网站的注册
  13. 他把我撞了,却骂我diao丝
  14. JVM--Java虚拟机
  15. 关于state和status
  16. 如何用C语言汉字编码输出汉字,【C语言学习】C语言汉字编码。。。C语言中汉字的输入...
  17. SAP MB51选择界面配置
  18. 【MySQL-函数】MySQL常用数学函数:round,ceil,floor,truncate,mod
  19. 山东电梯维护服务器,山东省质量技术监督局关于建立电梯维护保养单位告知性登记制度的通知...
  20. 博学之,审问之,慎思之,明辨之,笃行之:思考与成长

热门文章

  1. css3轮播不用jpuery_15款效果很酷的最新jQuery/CSS3特效
  2. sun服务器清理内存日志_sun服务器系统日志
  3. 为什么用python缩进来划分代码_Python 为什么抛弃累赘的花括号,使用缩进来划分代码块?...
  4. QToolButton设置图标位置
  5. EA出品的java射击类游戏,盘点五款射击类RPG游戏:你喜欢这类型游戏吗?
  6. web前端开发职业技能证书_1+x证书web前端开发职业技能等级标准1
  7. layuiadmin上手好难_新手如何快速上手自媒体赚钱?送你4个好建议!记得收藏
  8. 我们学的技术会过时吗?甚至被淘汰?
  9. 知乎:学计算机的女生都怎么样了?
  10. 「权威发布」2019年大学生电子设计竞赛获奖名单