Qt——发送自定义事件(下)

1.Qt可以自定义新的事件类

  • 自定义的事件类必须继承自QEvent
  • 自定义的事件类必须拥有全局唯一的Type值
  • 程序中必须提供处理自定义事件对象的方法

2.Qt中事件的Type值

  • 每个事件类都拥有全局唯一的Type值
  • 自定义事件类的Type值也需要自定义
  • 自定义事件类使用QEvent::User之后的值作为Type值
  • 程序中保证QEvent::User+VALUE全局唯一即可

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

  • 将事件过滤器安装到目标对象:在eventFilter()函数中编写自定义事件的处理逻辑
  • 在目标对象的类中重写事件处理函数:在event()函数中编写自定义事件的处理逻辑

StringEvent.h

复制代码
#ifndef STRINGEVENT_H
#define STRINGEVENT_H

#include <QEvent>
#include <QObject>
#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 <QWidget>
#include <QLineEdit>

class Widget : public QWidget
{
    Q_OBJECT
    QLineEdit m_edit;

public:
    explicit Widget(QWidget *parent = nullptr);
    bool event(QEvent* evt);
    bool eventFilter(QObject* obj, QEvent* evt);
    ~Widget() override;
};
#endif // WIDGET_H

Widget.cpp

复制代码
#include "Widget.h"
#include "StringEvent.h"
#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() == QEvent::MouseButtonDblClick )
    {
        qDebug() << "event: Before sendEvent";

        StringEvent e("Hello World");
        QApplication::sendEvent(&m_edit, &e);
        qDebug() << "event: After sendEvent";
    }
    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() = default;

当双击widget时,运行结果:

并且可以将Hello World填充到lineEdit中

相关推荐
A__tao5 分钟前
告别手写 Go 结构体!推荐一个支持注释解析的 YAML 转 Struct 在线工具
开发语言·后端·golang
何以解忧,唯有..8 分钟前
Go 语言语句分隔符详解:分号、换行与代码规范
开发语言·golang·代码规范
人邮异步社区11 分钟前
C语言进阶的书籍推荐
c语言·开发语言
凡人叶枫18 分钟前
Effective C++ 条款33:避免遮掩继承而来的名字
linux·服务器·开发语言·c++·嵌入式开发
10岁的博客19 分钟前
NOIP2010普及组「接水问题」详解:模拟算法与优先队列解法
开发语言·c++·算法
凡人叶枫19 分钟前
Effective C++ 条款31:将文件间的编译依存关系降至最低
linux·开发语言·c++·php·嵌入式开发·effective c++
heimeiyingwang29 分钟前
【架构实战】数据脱敏与隐私保护:合规是底线
java·开发语言·架构
于指尖飞舞44 分钟前
java后端面试题(常用集合极简)
java·开发语言·面试
稷下元歌1 小时前
python核心基础,这关于基于Moveltg加 Ros2实战Python编程基础实课
开发语言·python
AI人工智能+电脑小能手1 小时前
【大白话说Java面试题 第114题】【并发篇】第14题:说一下悲观锁的优点和缺点?
java·开发语言·面试