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

一、自定义事件对象

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

第四十四课、发送自定义事件(下)的相关文章

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

1. 自定义事件对象 (1)自定义事件类必须继承自QEvent (2)自定义的事件类必须拥有全局唯一的Type值 (3)程序中必须提供处理自定义事件对象的方法 2. 自定义事件类 (1)将QEvent作为父类继承 (2)指定全局唯一的Type值 class StringEvent: public QEvent { public: //提供全局唯一的Type值 static const Type TYPE = static_cast<Type>(QEvent::User + 0xFF); //.

第43课 发送自定义事件(上)

1. Qt中发送自定义事件 (1)阻塞型事件发送:事件发送后需要等待事件处理完成 (2)非阻塞型事件发送 ①事件发送后立即返回 ②事件被发送到事件队列中等待处理 2. QApplication类提供了支持事件发送的静态成员函数 (1)阻塞型发送函数 bool sendEvent(QObject* receiver, QEvent* event); (2)非阻塞型发送函数 void postEvent(QObject* receiver, QEvent* event); (3)注意事项 ①send

centos shell编程6一些工作中实践脚本 第四十节课

centos   shell编程6一些工作中实践脚本    第四十节课 上半节课 下半节课 f

NeHe OpenGL教程 第四十四课:3D光晕

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第四十四课:3D光晕 3D 光晕 当镜头对准太阳的时候就会出现这种效果,模拟它非常的简单,一点数学和纹理贴图就够了.好好看看吧. 大家好,欢迎来到新的一课,在这一课中我们将扩展glCamera类,来实现镜头光晕的效果.在日常生活中,

NeHe OpenGL教程 第四十二课:多重视口

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第四十二课:多重视口 多重视口 画中画效果,很酷吧.使用视口它变得很简单,但渲染四次可会大大降低你的显示速度哦:) 欢迎来到充满趣味的另一课.这次我将向你展示怎样在单个窗口内显示多个视口.这些视口在窗口模式下能正确的调整大小.其中有

NeHe OpenGL教程 第四十六课:全屏反走样

转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线教程的编写,以及yarn的翻译整理表示感谢. NeHe OpenGL第四十六课:全屏反走样 全屏反走样 当今显卡的强大功能,你几乎什么都不用做,只需要在创建窗口的时候该一个数据.看看吧,驱动程序为你做完了一切. 在图形的绘制中,直线的走样是非常影响美观的,我们可以使用反走样解决这个问题.在众多的解决

QT开发(四十四)——流方法解析XML

QT开发(四十四)--流方法解析XML 一.流方法解析XML简介 QT 4.3开始,QT引入了两个新的类来读取和写入XML文档:QXmlStreamReader和QXmlStreamWriter. QXmlStreamReader类提供了一个快速的解析器通过一个简单的流API来读取良构的XML文档,是作为QT的SAX解析器的替代者出现的,比SAX解析器更快更方便.    QXmlStreamReader可以从QIODevice或QByteArray中读取数据.QXmlStreamReader以一

【WPF学习】第四十四章 图画

原文:[WPF学习]第四十四章 图画 通过上一章的学习,Geometry抽象类表示形状或路径.Drawing抽象类扮演了互补的角色,它表示2D图画(Drawing)--换句话说,它包含了显示矢量图像或位图需要的所有信息. 尽管有几类画图类,但只有GeometryDrawing类能使用已经学习过的几何图形.它增加了决定如何绘制图形的画笔和填充细节.可将GeometryDrawing对象视为矢量插图中的形状.例如,可将标准的窗口元文件格式(.wmf)转换成准备插入用户界面的GeometryDrawi

第四十四章

第四十四章1 听罗博士讲述名人的烦恼 名与身孰亲? 名气与身体哪个更重要? 名气固然是有用的,然而不能因此放弃身体. 各位朋友大家好,今天我们接着来聊<道德经>.我们来看看老子老先生带给我们什么样的人生启发了. 今天聊第四十四章,这是新的一章了,这一章实际跟我们的人生真是有很大的关系了,因为我这个音频,除了在我微信公众号刊出之外,还在喜马拉雅播出,喜马拉雅的编辑曾经跟我说:“罗老师您最近能不能讲讲养生的内容啊?”我接下来会给大家讲中医的内容的,但是您说我讲的<道德经>就不是养生吗?