Qt 实现SendMessage和PostMessage机制

2020-06-11  本文已影响0人  爬上墙头deng红杏

引言

实现方案

#pragma once
#include <QObject>
#include <QEvent>
#include <QVariant>

void QPostMessage(QObject* obj, int msg, QVariant params);
long QSendMessage(QObject* obj, int msg, QVariant params);


static long s_rst = 0;
class LEvent : public QObject, public QEvent
{
public:
    LEvent(int msg, const QVariant params = QVariant(), long& rst = s_rst);
    ~LEvent();

public:
    static Type m_eventType;

    int m_message = 0;
    const QVariant& m_params;
    long& m_rst;
};
#include "LEvent.h"

QEvent::Type LEvent::m_eventType = (QEvent::Type)QEvent::registerEventType();

LEvent::LEvent(int msg, const QVariant params/* = QVariant()*/, long& rst/* = s_rst*/)
    : QEvent(m_eventType), m_message(msg), m_params(params), m_rst(rst)
{

}

LEvent::~LEvent()
{
}

void QPostMessage(QObject* obj, int msg, QVariant params)
{
    QCoreApplication::postEvent(obj, new LEvent(msg, params));
}

long QSendMessage(QObject* obj, int msg, QVariant params)
{
    long lResult = 0;
    if (obj->thread() == QThread::currentThread())
    {
        //事件队列不会删除事件。通常的方法是在栈上创建事件
        LEvent e(msg, params, lResult);
        QCoreApplication::sendEvent(obj, &e);
    }
    else
    {
        //事件队列将获得事件的所有权并在事件发送后删除它。必须在堆上创建事件     
        LEvent* e = new LEvent(msg, params, lResult);
        QCoreApplication::postEvent(obj, e, Qt::HighEventPriority);

        QEventLoop loop;
        // 当事件处理完毕后,事件实例会被销毁,通知loop退出事件循环
        QObject::connect(e, SIGNAL(destroyed(QObject*)), &loop, SLOT(quit()));
        loop.exec(QEventLoop::ExcludeUserInputEvents);
    }
    return lResult;
}

参考文章:
https://note.youdao.com/ynoteshare1/index.html?id=79b2bd18897960d901608f1d219e56f0&type=note

上一篇 下一篇

猜你喜欢

热点阅读