我对处理信号和插槽的方式有一个基本的Qt问题。我对框架很新,所以请原谅我,如果这听起来很愚蠢。我想知道我是否有某些信号连接到某些插槽。
signal1() ---> slot1(){ cout <<"a"; }
signal2() ---> slot2(){ cout <<"b"; }
signal3() ---> slot3(){ cout <<"c"; }
在我的代码中,我打电话给
emit signal1();
emit signal2();
emit signal3();
Qt是否保证将“abc”打印到屏幕上,换句话说,顺序处理插槽?或者它会产生一个单独的线程来执行每个插槽? 谢谢!
答案 0 :(得分:8)
默认情况下:
1)如果在接收对象具有亲和力的线程中发出信号,则立即执行连接到该信号的槽,就像正常的函数调用一样。所有插槽返回后,将在emit
语句后执行代码。
2)否则,当控制返回到接收者线程的事件循环时,将调用该槽。 emit
关键字后面的代码将立即继续,并且稍后将在接收者的线程中执行这些插槽。
有关此处连接类型的详细信息:http://qt-project.org/doc/qt-4.8/threads-qobject.html#signals-and-slots-across-threads
答案 1 :(得分:1)
只是添加到Kotlomoy的正确答案:)
您还可以通过提供可选参数ConnectionType来控制默认连接的类型: connect(obj,signal,obj,slot,connectionType)
您的主要选项是:
Qt :: QueuedConnection:仅当控制返回到线程的事件循环时才会运行。即将被添加到队列中。如果您不希望立即处理您的插槽,请指定此项,这可能非常有用。
Qt :: DirectConnection:或者您可以指定直接连接(如果需要,甚至可以在线程之间),但通常您不需要或不想使用此选项,因为当信号发送到插槽时它是默认的在同一个主题中。
如果您使用QueuedConnection,则可以按照该顺序将“abc”打印到屏幕上。
值得注意的是,如果在处理前一个插槽时发生了directConnect事件(假设某个其他外部事件触发了像IpSocket输入这样的信号),那么您将被“中断”。这不会发生在你的简单例子中。