zoukankan      html  css  js  c++  java
  • 第四十四课、发送自定义事件(下)------------------狄泰软件学院

    一、自定义事件对象

    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)、程序中需要提供自定义事件类的处理方法

  • 相关阅读:
    支持向量机(一)
    决策树(四)
    决策树(三)
    决策树(二)
    决策树(一)
    朴素贝叶斯(一)
    k近邻法(二)
    k近邻法(一)
    感知机
    mercurial 入门
  • 原文地址:https://www.cnblogs.com/gui-lin/p/6417971.html
Copyright © 2011-2022 走看看