信号和插槽在高级抽象层面上是如何工作的?
信号和插槽在高级抽象层面上是如何实现的?
像其他人说的那样,这个主题有非常好的 Qt 文档可用。如果你想知道底层发生了什么,这些信息可能会对你有所帮助:
槽函数只是普通的方法。没有特别之处,只是 moc 会将它们的签名保存在中间的 .moc 文件中的一个表中 - 当你浏览该文件时,可以清楚地看到这个表。
这个表允许你使用方法的签名调用一个方法。 SLOT(mySlot(int))
宏转换为所涉及方法的字符串表示形式。有几种方法可以做到这一点,请参见QMetaObject 的文档以获取更多信息。
当你将一个信号连接到槽函数时,信号和槽函数的签名将被存储以供后续使用。当一个信号被发射时,先前连接到该信号的所有槽函数都将使用上述方法进行调用。
如果你想了解更多信息,我建议查看 moc 生成的代码,并逐步跟踪信号发射和 connect() 调用的内部。这里没有什么魔术,但有很多聪明的技巧。
我们在您的另一个问题中已经回答了这个问题。
但是,更详细地说,MOC解析您的文件,查找信号/槽声明(以及属性和其他支持的结构),并基于这些生成中间代码文件。这些中间代码文件为库提供了强类型访问信号和槽,以便与您的对象通信。
qmake生成一个makefile,自动包括这些中间文件(以及任何生成的UI或资源文件)以及您自己的代码,因此您可以选择自己喜欢的工具链进行构建。