3

我对它处理信号和插槽的方式有一个基本的 Qt 问题。我对这个框架很陌生,如果这听起来很愚蠢,请原谅我。我想知道是否有某些信号连接到某些插槽。

signal1() ---> slot1(){ cout <<"a"; }
signal2() ---> slot2(){ cout <<"b"; }
signal3() ---> slot3(){ cout <<"c"; }

在我的代码中,我调用

emit signal1();
emit signal2();
emit signal3();

Qt 是否保证将“abc”打印到屏幕上,换句话说,按顺序处理插槽?还是会产生一个单独的线程来执行每个插槽?谢谢!

4

2 回答 2

9

默认:

1) 如果信号是在接收对象具有亲和性的线程中发出的,则连接到该信号的槽会立即执行,就像正常的函数调用一样。emit一旦所有插槽都返回,将执行语句后面的代码。

2) 否则,当控制返回接收者线程的事件循环时调用槽。关键字后面的代码emit将立即继续,插槽稍后将在接收者的线程中执行。

有关此处连接类型的更多信息:http: //qt-project.org/doc/qt-4.8/threads-qobject.html#signals-and-slots-across-threads

于 2013-06-08T23:26:41.410 回答
1

只是为了添加到 Kotlomoy 的正确答案:)

您还可以通过提供可选参数 ConnectionType 来控制默认的连接类型:connect(obj, signal, obj, slot, connectionType)

您的主要选择是:

  • Qt::QueuedConnection:这只会在控制返回到线程的事件循环时运行。即将被添加到队列中。如果您不希望立即处理您的插槽,请指定此项,这非常有用。

  • Qt::DirectConnection:或者,您可以指定直接连接(如果需要,甚至可以在线程之间),但通常您不需要或不想使用此选项,因为当信号被发送到同一线程中的插槽时,它是默认设置。

如果您使用 QueuedConnection,您将授权“abc”按该顺序打印到屏幕上。

值得注意的是,如果在处理前一个插槽时发生 directConnect 事件(假设其他一些外部事件触发了 IpSocket 输入等信号),那么您将被“中断”。在您的简单示例中不会发生这种情况。

于 2013-06-12T15:42:59.857 回答