一、自定义事件对象
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 <QEvent> #include <QString> //自定义事件类必须继承自QEvent class StringEvent : public QEvent { QString m_data; public: //必须提供事件类的Type值 static const Type TYPE = static_cast<Type>(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 <QtGui/QWidget> #include <QPushButton> #include <QLineEdit> 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 <QApplication> #include <QMouseEvent> #include <qDebug> 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<StringEvent*>(evt); myLineEdit.insert(se->data()); qDebug() <<"Receive: " << se->data(); return true; } return QWidget::eventFilter(obj, evt); } Widget::~Widget() { }
Widget.cpp
#include <QtGui/QApplication> #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)、程序中需要提供自定义事件类的处理方法
时间: 2024-10-08 06:31:31