QT事件处理–notify()
转载至:https://www.deeplearn.me/349.html
一、说明
Qt 处理事件的方式之一:”继承 QApplication 并重新实现 notify()函数”。Qt 调用 QApplication 来发送一个事件,重新实现 notify()函数是在事件过滤器得到所有事件之前获得它们的唯一方法。事件过滤器使用更为便利。因为可以同时有多个事件过滤器。而 notify()函数只有一个。
二、函数的使用
重新实现的 QApplication 类 MyApplication 的头文件 myapplication.h 如下:
#ifndef MYAPPLICATION_H
#define MYAPPLICATION_H #include <QApplication>
#include <QEvent> class MyApplication : public QApplication
{
public:
MyApplication(int & argc, char ** argv); public:
bool notify(QObject *receiver, QEvent *e);
}; #endif
myapplication.cpp 文件如下:
#include "myapplication.h"
#include <QMouseEvent> MyApplication::MyApplication(int & argc, char ** argv) : QApplication(argc, argv)
{
} bool MyApplication::notify(QObject *receiver, QEvent *e)
{
//屏蔽 MouseButtonPress、MouseButtonRelease 和 MouseMove 事件
if (e->type() == QEvent::MouseButtonPress || e->type() == QEvent::MouseButtonRelease || e->type() == QEvent::MouseMove)
{
return true;
}
return QApplication::notify(receiver, e);
}
mainwindow.h 文件如下:
#ifndef MAINWINDOW_H
#define MAINWINDOW_H #include <QtGui/QMainWindow>
#include <QPushButton>
#include <QMouseEvent> class MainWindow : public QMainWindow
{
Q_OBJECT public:
MainWindow(QWidget *parent = );
~MainWindow();
protected:
bool eventFilter(QObject *obj, QEvent *e);
private:
QPushButton *button;
}; #endif
mainwindow.cpp 文件如下:
#include "mainwindow.h" MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
{
button = new QPushButton;
this->setCentralWidget(button);
} MainWindow::~MainWindow()
{ } bool MainWindow::eventFilter(QObject *obj, QEvent *e)
{
if (obj == button) //响应 button 的 MouseButtonPress 和 MouseButtonRelease 事件
{
if (e->type() == QEvent::MouseButtonPress)
{
QMouseEvent *event = static_cast<QMouseEvent*> (e);
button->setText(QString("Press: %1, %2").arg(QString::number(event->x()), QString::number(event->y())));
return true;
}
else if (e->type() == QEvent::MouseButtonRelease)
{
QMouseEvent *event = static_cast<QMouseEvent*> (e);
button->setText(QString("Release: %1, %2").arg(QString::number(event->x()), QString::number(event->y())));
return true;
}
else
{
return false;
}
} return QMainWindow::eventFilter(obj, e);
}
main.cpp 文件如下:
#include <QtGui/QApplication>
#include <QtCore/QTextCodec>
#include "mainwindow.h"
#include "myapplication.h" int main(int argc, char *argv[])
{
MyApplication a(argc, argv);
QTextCodec::setCodecForTr(QTextCodec::codecForName("gb18030"));
MainWindow mainwindow;
a.installEventFilter(&mainwindow); //为 QApplication 注册过滤器
mainwindow.setWindowTitle(QObject::tr("继承 QApplication 并重新实现 notify()函数"));
mainwindow.resize(, );
mainwindow.show(); return a.exec();
}
运行程序,可以发现 button 不管是点击、释放还是拖动鼠标,都不会显示任何文本。因为我们已经子类化 QApplication,事件在到达 QApplication 的事件过滤器之前,会先到达 QApplication 的 notify()函数,我们已经在子类化的 MyApplication 中屏蔽了 MouseButtonPress、MouseButtonRelease 事件。所以为 MyApplication 对象注册的事件过滤器不起作用。程序运行界面为:
QT事件处理–notify()的更多相关文章
- Qt事件处理机制
研一的时候开始使用Qt,感觉用Qt开发图形界面比MFC的一套框架来方便的多.后来由于项目的需要,也没有再接触Qt了.现在要重新拾起来,于是要从基础学起. Now,开始学习Qt事件处理机制. 先给出原文 ...
- QT事件过滤器(QT事件处理的5个层次:自己覆盖或过滤,父窗口过滤,Application过滤与通知)
Qt事件模型一个真正强大的特色是一个QObject 的实例能够管理另一个QObject 实例的事件. 让我们试着设想已经有了一个CustomerInfoDialog的小部件.CustomerInfoD ...
- 【转】Qt 事件处理机制 (下篇)
转自:http://mobile.51cto.com/symbian-272816.htm 在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent. 接下来依次谈谈Qt中有谁来产生.分 ...
- 9、Qt 事件处理机制
原文地址:http://mobile.51cto.com/symbian-272812.htm 在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent. 接下来依次谈谈Qt中有谁来产生 ...
- Qt 事件处理的五个层次
看了这篇文章(见http://devbean.blog.51cto.com/448512/231861),然后经过自己的思考,把Qt事件处理的五个层次.同时也是Qt时间处理的流程画了出来.若有不对请批 ...
- Qt 事件处理机制
Qt 事件处理机制 因为这篇文章写得特别好,将Qt的事件处理机制能够阐述的清晰有条理,并且便于学习.于是就装载过来了(本文做了排版,并删减了一些冗余的东西,希望原主勿怪),以供学习之用. 简介 在Qt ...
- QT开发(十二)——QT事件处理机制
一.QT事件简介 QT程序是事件驱动的, 程序的每个动作都是由内部某个事件所触发.QT事件的发生和处理成为程序运行的主线,存在于程序整个生命周期. 常见的QT事件类型如下: 键盘事件: 按键按下和松开 ...
- Qt 事件处理机制 (下篇)
继续我们上一篇文章继续介绍,Qt 事件处理机制 (上篇) 介绍了Qt框架的事件处理机制:事件的产生.分发.接受和处理,并以视窗系统鼠标点击QWidget为例,对代码进行了剖析,向大家分析了Qt框架如何 ...
- 【转】解读Qt 事件处理机制(上篇)
[转自]:http://mobile.51cto.com/symbian-272812.htm 在Qt中,事件被封装成一个个对象,所有的事件均继承自抽象类QEvent. 接下来依次谈谈Qt中有谁来产生 ...
随机推荐
- 设计模式课程 设计模式精讲 19-2 策略模式coding
1 代码演练 1.1 代码演练1(多态) 1.2 代码演练2(优化应用) 1.3 代码演练3(策略模式结合工厂模式) 1 代码演练 1.1 代码演练1(多态) 需求: 木木网卖课程,为了促进销售,61 ...
- C语言中的指针与数组的定义与使用
指针的特点 他就是内存中的一个地址 指针本身运算 指针所指向的内容是可以操作的 操作系统是如何管理内存的 栈空间 4M~8m的大小 当进入函数的时候会进行压栈数据 堆空间 4g的大小 1g是操作系统 ...
- Java 正则?:?=?!的理解
上图是官方文档的介绍,总结一下讲了两个知识点 ①是否获取匹配并保存匹配的值.②正向预查和反向预查. 1:解释是否获取匹配并保存匹配的值 ()表示捕获分组,获取匹配,()把每个分组里的匹配的值保存起来 ...
- 把PHP大牛记下来,方便以后关注
本帖最后由 fish_study 于 2014-12-31 00:18 编辑 五四陈科学院博主54chen(陈臻),哥学社创始人,前人人网分布式存储nuclear研发人员,现关注erlang.hado ...
- Java程序与其它进程的数据通信
Java程序中可以启动其他的应用程序,这种在Java中启动的进程称为子进程,启动子进程的Java程序称为父进程,其实这个父进程就是一个Java虚拟机1.在Java程序中可以用Process类的实例对象 ...
- vb.net自学完整版
https://m.book118.com/html/2016/1203/67671992.shtm
- vue - 封装input
input子组件 <el-input :value="value" placeholder="请输入内容" size="small" ...
- Linux之文件传输
本文借鉴<Linux命令大全> 1. bye命令 功能:终端FTP连线并结束程序 语法:bye 补充:在ftp模式下,输入bye即可中断目前的连线作业,并结束ftp的执行. 2. ftp命 ...
- Java服务端对Cookie的简单操作
Java服务端对Cookie的简单操作 时间 2016-04-07 10:39:44 极客头条 原文 http://www.cuiyongzhi.com/index.php/post/15.html ...
- Mysql数据库日志,备份及回滚操作
一.打开二进制日志配置 : 在Windows系统下,对mysql的my.ini的log-bin等进行配置目录位置时,假设要将log-bin的日志配置到D盘的mysqllog的文件为binlog.则可以 ...