我需要实现一个简单的消息总线:
我正在考虑使用QSignalMapper标记“命名事件”,然后从插槽重新发出或将发布者信号连接到订阅者的信号......
有任何建议吗?或者我应该采用相对简单的设计模式?
PS:在Windows上使用D-Bus的AFAICS,您需要安装“第三方”软件才能使用Qt。
答案 0 :(得分:3)
为什么不直接使用一个专用的QObject子类作为消息总线?在那里,您可以定义可以通过消息总线交换的所有信号,并提供发出这些信号的相应通知方法。现在,每个想要接收“消息”的组件都可以连接到感兴趣的信号。
如果您想要更通用的方法,请使用与以前相同的方法。但是,(singleton)QObject子类现在只有一个“message(QByteArray)”信号和一个发出此信号的“sendMessage(QByteArray)”公共方法。您可能还希望将发送消息方法声明为插槽,以防万一您想要将另一个信号连接到send方法。
我自己使用这些方法,他们的工作非常好。甚至不同的线程也可以使用这种机制相互通信而没有任何问题。如果你使用QByteArray方法,你会得到类似于DBus的东西。您可以序列化和反序列化您的消息,并自动确保所有消息接收者都获得他们自己的消息副本,如果您进行并行计算,则会获得所有好处。
答案 1 :(得分:0)
你可以试试这个。这正是你想要的。它重量轻,易于使用。 https://github.com/lheric/libgitlevtbus
#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;
}