第44课 - 发送自定义事件

1、自定义事件对象 

Qt可以自定义新的事件类 

     -自定义的事件类必须继承自QEvent 

     -自定义的事件类必须拥有全局唯一的Type值

     -程序中必须提供处理自定义事件对象的方法 

自定义事件类 

       1. 将QEvent作为父类继承 

       2. 指定全局唯一的Type值 

class StringEvent : public QEvent //自定义事件类
{
    QString m_data;
public:
    const static Type TYPE = static_cast<Type>(QEvent::User + 0xFF);
    //    
};

enum QEvent::Type

This enum type defines the valid event types in Qt. 

Qt中事件的Type值 

     -每个事件类都拥有全局唯一的Type值

     -自定义事件类的Type值也需要自定义 

     -自定义事件类使用QEvent::User之后的值作为Type值

     -程序中保证QEvent::User + VALUE全局唯一即可 

 

处理自定义事件对象的方法 

       1. 事件过滤器安装到目标对象 

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

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

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

2、编程实验 

发送和处理自定义事件    44-1.pro 

StringEvent.h

#ifndef _STRINGEVENT_H_
#define _STRINGEVENT_H_

#include <QEvent>
#include <QString>

class StringEvent : public QEvent //自定义事件类
{
    QString m_data;
public:
    const static Type TYPE = static_cast<Type>(QEvent::User + 0xFF);

    explicit StringEvent(QString data = "");
    QString data();
    
};

#endif // _STRINGEVENT_H_

StringEvent.cpp

#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)//重写event事件处理函数
{
    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;//返回true,代表当前事件已被处理
    }

    return QWidget::eventFilter(obj, evt);
}

Widget::~Widget()
{
    
}

双击窗口任意空白区

为什么要自定义事件类? 

        -需要扩展一个已有组件类的功能 

        -需要开发一个全新功能的组件类 

        -需要向一个第三方的组件类发送消息

        -゜ ゜ ゜ 

 

3、小结 

自定义事件类必须继承自QEvent 

自定义事件类使用QEvent::User之后的值作为Type值 

自定义事件类的Type值必须全局唯一 

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

猜你喜欢

转载自blog.csdn.net/qq_39654127/article/details/81624295