Qt自定义事件实现及子线程向主线程传送事件消息

这篇博客详细介绍了在Qt中如何实现自定义事件,包括通过QEvent::Type直接定义和从QEvent派生类的方式,并讲解了子线程如何向主线程发送事件消息。博主提供了完整的代码示例,涵盖了从创建自定义事件类型、注册事件到使用QCoreApplication::postEvent()和QCoreApplication::sendEvent()的区别。最后,强调理解Qt的事件传递机制的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近在重新学习Qt的时候,因为要涉及到子线程与主线程传递消息,所以便琢磨了一下,顺便把实用的记录下来,方便自己以后查询及各位同仁的参考!

特此声明,本篇博文主要讲述实用的,也就是直接说明怎么实现,就不打算陈述一大堆理论啦,不过,还是建议大家去查查相应的理论比较好,这样能对Qt的消息传送机制的理解更加深入!

根据网上大多数人的资料,要实现自定义消息,需要从QEvent 派生一个自定义的事件;其实也可以不需要,只要使用QEvent::Type自定义一个事件就行了。在这里,本人把两种实现方法都在这里讲述一下!


一、这里先讲述使用 QEvent::Type 定义一个自定义事件

      1、新建一个新的工程 “myEvent” ,在 ui 界面添加一个按钮,并未按钮添加 onclick() 响应函数。

      2、在 widget.h 头文件使用 QEvent::Type 定义两个自定义事件。

      3、重新实现 event() 虚函数

bool event(QEvent* e);
      4、添加 #include<QEvent>

整个头文件如下:

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QEvent>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

    bool event(QEvent* e);

private slots:
    void on_pushButton_clicked();

private:
    Ui::Widget *ui;

    QEvent::Type myEvent1;
    QEvent::Type myEvent2;

};

#endif // WIDGET_H

      5、使用QEvent::registerEventType() 静态函数为刚才两个自定义事件注册值。

      6、重新实现 event()  函数 。

      7、在 按钮响应函数里面发送时间消息。

widget.cpp 文件如下:

#include "widget.h"
#include "ui_widget.h"
#include <QMessageBox>
#include <QCoreApplication>
#include <QDebug>

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    myEvent1 = static_cast<QEvent::Type>(QEvent::registerEventType(-1));
    myEvent2 = static_
### 子线程主线程通信的方式及实现方法 #### 使用 `Handler` 实现子线程主线程间的通信 在Android开发环境中,为了确保UI更新的安全性和效率,通常采用`Handler`机制让子线程能够安全地通知主线程进行界面刷新或其他操作。具体来说,在主线程中声明并实例化一个继承自`Handler`类的对象,并重载其`handleMessage()`方法用于接收来自其他线程消息[^1]。 ```java private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what){ case UPDATE_MESSAGE: // 更新UI逻辑 break; default: break; } } }; ``` 当需要从工作线程发送数据回主线程时,则可以通过调用`mHandler.sendMessage()`或`sendMessageDelayed()`等API完成这一过程。 #### 利用 Qt 的信号和槽机制以及事件分发体系 对于跨平台应用程序框架Qt而言,除了传统的基于回调接口的设计模式外,还提供了更为直观简便的解决方案——即利用内置的支持多线程间协作特性的信号(Signal)/槽(Slot)模型来进行交互;另外一种则是借助于`QCoreApplication::postEvent()`函数来触发特定类型的事件对象至目标接受者处等待处理[^3]。 ##### 通过信号和槽连接不同线程中的组件 假设存在两个独立运行的工作单元A(作为发射端)B(扮演监听者的角色),那么可以在前者内部定义好对外公开的通知接口(Signal),而后者则负责注册相应的响应行为(Slot)。一旦满足条件便自动激活关联动作链路: ```cpp // WorkerThread.h class WorkerThread : public QThread { Q_OBJECT signals: void dataReady(const QString &data); public slots: void processData(); }; // MainWindow.cpp connect(worker, SIGNAL(dataReady(QString)), this, SLOT(updateUiWithNewData(QString))); ``` 上述代码片段展示了如何建立一对多的关系网状结构以便灵活应对复杂场景下的需求变化趋势[^2]。 ##### 应用 postEvent 方法投递定制化的 Event 对象 另一种情况涉及到更底层的操作层面,比如想要绕过标准控件库所提供的封装好的消息循环之外自行构建一套专属的信息流转渠道。此时可以考虑引入`QCustomEvent`派生的新类别实体,并配合使用全局静态成员函数`QCoreApplication::postEvent()`将其注入到指定窗口部件所属的任务调度池里排队等候进一步处置[^4]。 ```cpp int eventType = QEvent::User + 1; MyCustomEvent *event = new MyCustomEvent(eventType , someData); QCoreApplication::postEvent(targetWidget,event); ``` 需要注意的是,这种方式下应当特别留意内存管理方面的问题,确保即使在线程终止前也能妥善保存尚未传达完毕的数据项直至最终得到正确解析为止。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值