如何在QT应用程序中创建SignalHub?

时间:2018-08-10 09:04:09

标签: linux qt5

QT5上有一个多线程应用程序。线程彼此之间发出信号。例如,GUI中的按钮单击信号来自三个单独的线程,每个线程执行其自己的功能。有没有一种简单的方法可以将所有信号连接到某个对象,我们称之为SignalHub?而这个SignalHub将接收来自所有线程或对象的所有信号,并且任何线程或对象都可以订阅所需的信号吗?类似于DBus,但仅适用于单个QT应用程序中的多个线程吗?每个线程或对象都不应该接收自己的信号。这样做的目的是减少代码量(应用程序中有多个线程,每个线程都有多个信号和插槽)。并且最好仅在新对象的构造函数或新线程的构造函数中将必要的信号连接到SignalHub(或从SignalHub连接)。

1 个答案:

答案 0 :(得分:0)

信号是线程安全的。 connect()和disconnect()也是如此。含义:您可以从字面上声明要成为“信号中心”的任何对象,并根据需要仅在线程之间连接插槽。所涉及的对象属于哪个线程无关紧要。没问题。

为避免接收到对象自身发送的信号,您可以按照以下方式简单地做一些事情:

void MyObject::someSlot() {
  if(sender() == this) return;
}