博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
第四十四课、发送自定义事件(下)------------------狄泰软件学院
阅读量:6921 次
发布时间:2019-06-27

本文共 2825 字,大约阅读时间需要 9 分钟。

一、自定义事件对象

1、Qt可以自定义新的事件类

(1)、自定义的事件类必须继承自QEvent

(2)、自定义的事件类必须拥有全局唯一的Type值(event->type()可以获得事件的类型)

(3)、程序中必须提供处理自定义事件的方法

2、自定义事件类

(1)、将QEvent作为父类继承

(2)、指定全局唯一的Type值

3、Qt事件的Type值

(1)、每个事件类都拥有全局唯一的Type值(类似于唯一的ID号)

(2)、自定义事件类的Type值也需要自定义

(3)、自定义事件类使用QEvent::User之后的值作为Type值(因为之前的值都被Qt预定义的事件用了)

(4)、程序中保证QEvent::User + VALUE 全局唯一即可

4、处理自定义事件的方法(两种方式)

(1)、将事件过滤器安装到目标对象

A、在eventFilter()函数中编写自定义事件的处理逻辑

(2)、在目标对象的类中重写事件处理函数

A、在event函数中编写自定义事件的处理逻辑

5、自定义事件类的意义

(1)、需要扩展一个已有组件类的功能

(2)、需要开发一个全新功能的组件类

(3)、需要向一个第三方的组件类发送消息

#ifndef _STRINGEVENT_H_#define _STRINGEVENT_H_#include 
#include
//自定义事件类必须继承自QEventclass StringEvent : public QEvent{ QString m_data;public: //必须提供事件类的Type值 static const Type TYPE = static_cast
(QEvent::User + 0xFF); explicit StringEvent(QString data = ""); QString data();};#endif // _STRINGEVENT_H_
自定义事件类StringEvent 的头文件
#include "StringEvent.h"StringEvent::StringEvent(QString data):QEvent(TYPE){    m_data = data;}QString StringEvent::data(){    return m_data;}
自定义事件类StringEvent的实现文件
#ifndef WIDGET_H#define WIDGET_H#include 
#include
#include
class Widget : public QWidget{ Q_OBJECT QLineEdit myLineEdit; QPushButton myButton;public: bool eventFilter(QObject *obj, QEvent *evt); Widget(QWidget *parent = 0); bool event(QEvent* e); ~Widget();};#endif // WIDGET_H
Widget.h
#include "Widget.h"#include "StringEvent.h"#include 
#include
#include
Widget::Widget(QWidget *parent) : QWidget(parent),myLineEdit(this){ myLineEdit.installEventFilter(this);//this 对象作为过滤器来检测myLineEdit对象收到的事件}//发送自定义事件对象(当鼠标双击窗口时)。bool Widget::event(QEvent* evt){ if(evt->type() == QMouseEvent::MouseButtonDblClick) { qDebug() << "event: Before sentEvent"; StringEvent se("SantaClaus"); QApplication::sendEvent(&myLineEdit, &se);//将事件对象发送给编辑框 qDebug() << "event: After sendEvent"; } return QWidget::event(evt);}//自定义事件的处理,通过eventFilter编写自定义事件的处理逻辑bool Widget::eventFilter(QObject *obj, QEvent *evt){ if((obj == &myLineEdit) && (evt->type() == StringEvent::TYPE)) { StringEvent* se = dynamic_cast
(evt); myLineEdit.insert(se->data()); qDebug() <<"Receive: " << se->data(); return true; } return QWidget::eventFilter(obj, evt);}Widget::~Widget(){}
Widget.cpp
#include 
#include "Widget.h"int main(int argc, char *argv[]){ QApplication a(argc, argv); Widget w; w.show(); return a.exec();}
main.cpp

二、小结

(1)、自定义事件类必须继承自QEvent

(2)、自定义事件类使用QEvent::User后的值作为Type值

(3)、自定义事件类的Type值必须全局唯一

(4)、程序中需要提供自定义事件类的处理方法

 

转载于:https://www.cnblogs.com/gui-lin/p/6417971.html

你可能感兴趣的文章
Java多线程做压力测试
查看>>
Docker学习与实践 Ⅱ
查看>>
Ubuntu下SSH设置
查看>>
HtmlHelper 扩展
查看>>
DCM4CHEE概述
查看>>
火掌柜iOS端基于CocoaPods的组件二进制化实践
查看>>
过去一年,被我们“高估”的技术清单
查看>>
TiDB中的混沌测试实践
查看>>
90 后 CTO 创业 6 年,做了一件改变互联网的“小事”
查看>>
宝马将机器架上微软 Azure,国内科技巨头也难抵汽车“诱惑”
查看>>
从程序员到架构师的最佳技术成长之路
查看>>
2014年基于Raspberry Pi的5大项目
查看>>
Linux信号系统
查看>>
.NET Native:将.NET应用编译为原生应用
查看>>
彻底理解Javascript中的变量对象
查看>>
Coinbase是如何在其加密货币交易平台上应对扩展性挑战的
查看>>
工信部:今年将发放5G临时牌照,预计下半年5G手机投放市场
查看>>
腾讯云联手创梦天地支持全球独立游戏开发者
查看>>
Cloudera与Hortonworks合并,旨在提升云服务竞争力
查看>>
微服务架构之外的选择——基于服务架构
查看>>