Qt问题:信号和槽是如何工作的?

15

信号和插槽在高级抽象层面上是如何工作的?

信号和插槽在高级抽象层面上是如何实现的?


我对这个拼写也感到痒痒的..天知道为什么 - jrharshath
4个回答

15

11

像其他人说的那样,这个主题有非常好的 Qt 文档可用。如果你想知道底层发生了什么,这些信息可能会对你有所帮助:

槽函数只是普通的方法。没有特别之处,只是 moc 会将它们的签名保存在中间的 .moc 文件中的一个表中 - 当你浏览该文件时,可以清楚地看到这个表。

这个表允许你使用方法的签名调用一个方法。 SLOT(mySlot(int)) 宏转换为所涉及方法的字符串表示形式。有几种方法可以做到这一点,请参见QMetaObject 的文档以获取更多信息。

当你将一个信号连接到槽函数时,信号和槽函数的签名将被存储以供后续使用。当一个信号被发射时,先前连接到该信号的所有槽函数都将使用上述方法进行调用。

如果你想了解更多信息,我建议查看 moc 生成的代码,并逐步跟踪信号发射和 connect() 调用的内部。这里没有什么魔术,但有很多聪明的技巧。


1
很聪明,但没有魔法!这让我想起了http://catb.org/esr/jargon/html/magic-story.html。 - jrharshath
有两种类型的连接。第一种是在信号被发出时调用槽函数。第二种是将槽函数调用放置在事件循环队列中。您可以在connect中手动选择方法,但是来自不同线程的信号和槽函数的连接始终会排队等待。 - JustAnotherCurious

5

我们在您的另一个问题中已经回答了这个问题。

为什么Qt使用自己的构建工具qmake?

但是,更详细地说,MOC解析您的文件,查找信号/槽声明(以及属性和其他支持的结构),并基于这些生成中间代码文件。这些中间代码文件为库提供了强类型访问信号和槽,以便与您的对象通信。

qmake生成一个makefile,自动包括这些中间文件(以及任何生成的UI或资源文件)以及您自己的代码,因此您可以选择自己喜欢的工具链进行构建。


4

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接