如何在Qt中模拟消息总线?

如何在Qt中模拟消息总线?,qt,dbus,publish-subscribe,Qt,Dbus,Publish Subscribe,我需要实现一个简单的消息总线: 只有一个进程因此不需要D-Bus 发布/订阅类型化事件(甚至可以是QObject) 我正在考虑使用QSignalMapper标记“命名事件”,然后从插槽重新发射或将发布者信号连接到订阅者的信号 有什么建议和想法吗?还是应该选择相对简单的设计模式 PS:AFAICS for D-Bus在windows上您需要安装“第三方”软件才能与Qt配合使用。为什么不使用一个专用的QObject子类作为消息总线?在这里,您定义了可能通过消息总线交换的所有信号,并提供了发出这些

我需要实现一个简单的消息总线:

  • 只有一个进程因此不需要D-Bus
  • 发布/订阅类型化事件(甚至可以是QObject)
我正在考虑使用QSignalMapper标记“命名事件”,然后从插槽重新发射或将发布者信号连接到订阅者的信号

有什么建议和想法吗?还是应该选择相对简单的设计模式


PS:AFAICS for D-Bus在windows上您需要安装“第三方”软件才能与Qt配合使用。

为什么不使用一个专用的QObject子类作为消息总线?在这里,您定义了可能通过消息总线交换的所有信号,并提供了发出这些信号的相应通知方法。现在,每个想要接收“消息”的组件都可以连接到感兴趣的信号

如果您想要更通用的方法,请使用与以前相同的方法。但是,(singleton)QObject子类现在只有一个“message(QByteArray)”信号和一个发出该信号的“sendMessage(QByteArray)”公共方法。您可能还希望将send message方法声明为slot,以防将另一个信号连接到send方法


我自己使用这些方法,它们工作得非常好。即使是不同的线程也可以使用这个机制彼此通信,没有任何问题。如果您使用QByteArray方法,您将得到类似于DBus的东西。您可以对消息进行序列化和反序列化,并自动确保所有消息接收者都有自己的消息副本,如果您进行并行计算,将获得所有好处。

您可以尝试此方法。这绝对是你想要的。它重量轻,使用方便。

#包括“gitlmodal.h”
#包括
int main(int argc,char*argv[])
{
GitlModal Cmodal;
///按名称订阅事件(“我是测试事件”)
cModual.subscribeToEvtByName(“我是一个测试事件”,
[](GitlEvent&rcEvt)->bool//qDebug()关于成为该链接作者的免责声明可能并不太糟糕。此外,一些示例代码(以及为什么它比其他东西更好的说明)也会有所帮助,因为这里不需要只提供链接的答案。
#include "gitlmodual.h"
#include <QDebug>

int main(int argc, char *argv[])
{
    GitlModual cModual;

    /// subscribe to an event by name ("I am a test event")
    cModual.subscribeToEvtByName("I am a test event",
    [](GitlEvent& rcEvt)->bool                          ///< lambda function as a callback
    {
        qDebug() << "Hello GitlEvtBus!";
        return true;
    }
    );

    GitlEvent cEvent("I am a test event");              ///< create an event
    cEvent.dispatch();                                  ///< dispatch

    /// output: "Hello GitlEvtBus!"

    return 0;
}