Qt学习之路(10):自定义事件与事件控制的5大层次
来源:互联网 发布:top gear 知乎 编辑:程序博客网 时间:2024/06/04 23:37
首先回顾事件控制的5个层次:
1. 重写paintEvent()、mousePressEvent()等事件处理函数。这是最普通、最简单的形式,同时功能也最简单。
2. 重写event()函数。event()函数是所有对象的事件入口,QObject和QWidget中的实现,默认是把事件传递给特定的事件处理函数。
3. 在特定对象上面安装事件过滤器。该过滤器仅过滤该对象接收到的事件。
4. 在QCoreApplication::instance()上面安装事件过滤器。该过滤器将过滤所有对象的所有事件,因此和notify()函数一样强大,但是它更灵活,因为可以安装多个过滤器。全局的事件过滤器可以看到 disabled 组件上面发出的鼠标事件。全局过滤器有一个问题:只能用在主线程。
5. 重写QCoreApplication::notify()函数。这是最强大的,和全局事件过滤器一样提供完全控制,并且不受线程的限制。但是全局范围内只能有一个被使用(因为QCoreApplication是单例的)。
========================================================================
自己定义事件:首先需要从QEvent派生出一个类来,然后通过Qt的API函数发送,最后自己在相应的接收方进行处理.
[1]自己定义一个事件
#ifndef CUSTOMEVENT#define CUSTOMEVENT#include "QEvent"#define MyType static_cast<QEvent::Type>(QEvent::User+12)//QEvent::registerEventType(1999)class MyCustomEvent:public QEvent{public: MyCustomEvent():QEvent(MyType),name("hmmm"){}public: QString name;};#endif // CUSTOMEVENT
bool MainWindow::eventFilter(QObject* obj,QEvent* event){ if(event->type()==MyType) { qDebug()<<"EventFilter"; return false;//这里是为了继续让handler处理 } return QMainWindow::eventFilter(obj,event);//不确定是否还有其他的时间过滤,调用父类的函数}/****************重写自定义事件的handler********************/void MainWindow::customEvent(QEvent* event){ if(event->type() == MyType)//如果等于我们自定义的事件,那么就处理它 { auto Myevent = static_cast<MyCustomEvent*>(event); qDebug()<<":"<<Myevent->name; }}/*******************在event函数里面处理******************/bool MainWindow:: event(QEvent* event){ if(event->type()==MyType) { qDebug()<<"event() is processiing the MyCustomEvent"; } return QMainWindow::event(event);}
//main.cpp#include <QApplication>#include "mainwindow.h"#include "QMenuBar"#include "QSpinBox"#include "QWidget"#include "QSlider"#include "QHBoxLayout"#include "eventlabel.h"#include "memory"#include "customevent.h"#include "QCoreApplication"int main(int argc, char *argv[]){ QApplication a(argc, argv); MainWindow w; MyCustomEvent event;//生成一个自定义的时间对象 QWidget s; w.show(); a.installEventFilter(&w);//向整个程序添加事件过滤器 w.installEventFilter(&w);//将主窗口上加载自己的事件过滤器 QCoreApplication::sendEvent(&w,&event); return a.exec();}##最后输出
1 0
- Qt学习之路(10):自定义事件与事件控制的5大层次
- Qt学习之路(23): 自定义事件
- Qt学习之路(23): 自定义事件
- Qt学习之路(23): 自定义事件
- Qt学习之路(23): 自定义事件
- Qt学习之路(23): 自定义事件
- Qt学习之路(23): 自定义事件
- Qt学习之路(23): 自定义事件
- QT学习 之 事件与事件过滤器
- Qt事件处理的五个层次、Qt自定义事件的实现
- Qt 学习之路 2(23):自定义事件
- Qt 学习之路 2(23):自定义事件
- Qt事件处理的五个层次
- Qt事件处理的五个层次
- Qt学习之路(20): 事件接收与忽略
- Qt学习之路(20): 事件接收与忽略
- Qt学习之路(20): 事件接收与忽略
- Qt学习之路(20): 事件接收与忽略
- Python学习笔记 基础语法
- ITOO4.1之LocalStorage 本地存储
- 大数据的启蒙
- php rewrite模式
- 1193: [HNOI2006]马步距离
- Qt学习之路(10):自定义事件与事件控制的5大层次
- 什么是HTTP?Ping命令是什么?
- 线性堆栈
- 浅谈ThinkPhp里的utf8格式字符串截取
- 欢迎使用CSDN-markdown编辑器
- leetcode -- Binary Tree Maximum Path Sum -- 重要
- CF #GoodBye 2014 A~E
- 泛型与增强for
- DEV控件中GridView控件导出报表问题