第44课 发送自定义事件(下)

1、自定义事件对象

    1.1、 Qt可以自定义新的事件类
        1.1.1、 自定义的事件类必须继承自QEvent
        1.1.2、 自定义的事件类必须拥有全局唯一的Type值(event->type()可以获得事件的类型)
        1.1.3、 程序中必须提供处理自定义事件的方法

    1.2、 自定义事件类
        1.2.1、 QEvent作为父类继承
        1.2.2、指定全局唯一的Type值
                            

    1.3、 Qt事件的Type值
        1.3.1、每个事件类都拥有全局唯一的Type值(类似于唯一的ID号)
        1.3.2、 自定义事件类的Type值也需要自定义
        1.3.3、 自定义事件类使用QEvent::User之后的值作为Type值(因为之前的值都被Qt预定义的事件用了)
        1.3.4、 程序中保证QEvent::User + VALUE 全局唯一即可

    1.4、 处理自定义事件的方法(两种方式)
        1.4.1、 将事件过滤器安装到目标对象
            A、 在eventFilter()函数中编写自定义事件的处理逻辑
        1.4.2、 在目标对象的类中重写事件处理函数
            A、 在event函数中编写自定义事件的处理逻辑

    1.5、 自定义事件类的意义
        1.5.1、 需要扩展一个已有组件类的功能
        1.5.2、 需要开发一个全新功能的组件类
        1.5.3、 需要向一个第三方的组件类发送消息

自定义事件类的头文件

#ifndef _STRINGEVENT_H_
#define _STRINGEVENT_H_
#include <QEvent>
#include <QString>
class StringEvent : public QEvent//自定义事件类必须继承自QEvent
{
    QString m_data;
public:
    const static Type TYPE = static_cast<Type>(QEvent::User + 0xFF);
    //必须提供事件类的Type值, 静态常量:不可修改,防止被别的文件使用,直接类名就可以访问
    explicit StringEvent(QString data = "");
    QString data();
};
#endif // _STRINGEVENT_H_

自定义实现类的文件

#include "StringEvent.h"
StringEvent::StringEvent(QString data) : QEvent(TYPE)
{
    m_data = data;
}
QString StringEvent::data()
{
    return m_data;
}

Widget.h

#ifndef WIDGET_H
#define WIDGET_H
#include <QtGui/QWidget>
#include <QLineEdit>
class Widget : public QWidget
{
    Q_OBJECT
    QLineEdit m_edit;
public:
    Widget(QWidget *parent = 0);
    bool event(QEvent* evt);//事件处理函数。
    bool eventFilter(QObject* obj, QEvent* evt);//事件过滤器函数。
    ~Widget();
};
#endif // WIDGET_H


Widget.cpp

#include "Widget.h"
#include "StringEvent.h"
#include <QMouseEvent>
#include <QDebug>
#include <QApplication>
Widget::Widget(QWidget *parent)
    : QWidget(parent), m_edit(this)
{
    m_edit.installEventFilter(this);
}
bool Widget::event(QEvent* evt)//事件处理函数。自定义(双击窗口这个事件)
{
    if( evt->type() == QMouseEvent::MouseButtonDblClick )
    {
        qDebug() << "event: Before sentEvent";
        StringEvent e("D.T.Software");
        QApplication::sendEvent(&m_edit, &e);//将事件对象发送给编辑框。
        qDebug() << "event: After sentEvent";
    }
    return QWidget::event(evt);
}
bool Widget::eventFilter(QObject* obj, QEvent* evt)//事件过滤器函数。自定义事件类型。
{
    if( (obj == &m_edit) && (evt->type() == StringEvent::TYPE) )
    {
        StringEvent* se = dynamic_cast<StringEvent*>(evt);
        qDebug() << "Receive: " << se->data();
        m_edit.insert(se->data());
        return true;
    }
    return QWidget::eventFilter(obj, evt);
}
Widget::~Widget()
{
}

main.cpp

#include <QtGui/QApplication>
#include "Widget.h"
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    
    return a.exec();
}



2、小结

    2.1、 自定义事件类必须继承自QEvent
    2.2、 自定义事件类使用QEvent::User后的值作为Type值
    2.3、 自定义事件类的Type值必须全局唯一
    2.4、 程序中需要提供自定义事件类的处理方法






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值