首页 > 代码库 > 第四十四课、发送自定义事件(下)

第四十四课、发送自定义事件(下)

一、自定义事件对象

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 = http://www.mamicode.com/"");
    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)、程序中需要提供自定义事件类的处理方法

 

第四十四课、发送自定义事件(下)