基于QObject的类与自身具有排队连接

时间:2012-06-27 15:41:27

标签: qt qt4 signals-slots qt4.7 qobject

我正在深入研究我正在研究的一些源代码。我找到了一个有人编码的特殊声明。源代码是带有QML GUI的GUI应用程序,使用QT 4.7.x。

下面的代码段属于核心应用程序逻辑。

// connect signal-slots for decoupling
QObject::connect (this, SIGNAL(setCurrentTaskSignal(int)), this, 
    SLOT(SetCurrentTaskSlot(int)), Qt::QueuedConnection);

奇怪的是,对象通过排队连接连接到自身,这实际上意味着对象可以同时“生活”在不同的线程中?

乍一看,这对我没有任何意义。任何人都可以想到为什么这种联系似乎是合情合理的还是需要的?这甚至会起作用吗?

2 个答案:

答案 0 :(得分:10)

它没有任何问题。也许在调用SetCurrentTaskSlot之前需要一些事件循环处理?

请注意,QueuedConnection并不意味着某些东西在不同的线程中。 QueuedConnection仅表示发出信号时,不会直接调用相应的槽。它将在事件循环中排队,并在将控制权返回给事件循环时进行处理

答案 1 :(得分:3)

排队连接并不意味着接收器的位置。相反的情况是:要安全地将信号发送到另一个线程中的对象,您必须使用排队连接。但是你可以将它们用于生活在任何线程中的对象!

一个使用排队连接来确保信号将从事件循环中传递,而不是像直接连接那样立即从emit站点传递。直接连接在概念上是一组对列表上的函数指针的调用。排队连接在概念上是发送给聪明接收者的事件,接收者可以根据事件内容执行函数调用。

事件是内部QMetaCallEventQObject::event作用于此事件并执行调用。