2

我做 Qt 程序员已经有一段时间了,我了解 Qt 的大部分一般特性。我仍然对连接语句如何在运行时将信号连接到插槽感到困惑。基本上我想了解编译时发生了什么以及运行时发生了什么..

编译时间:元对象编译器将生成代码以在附加的 cpp 文件中实现信号(每个包含 Q_OBJECT 的类一个)。

运行时:信号被映射到一个槽,槽被执行?这是我不清楚的部分...SIGNAL 和 SLOTS 是扩展为信号/插槽名称的字符串表示形式的宏...这和元对象如何帮助在运行时将调用映射到插槽?细节将不胜感激...

编辑:这个链接会给你一个更好的主意..(只有当你对血腥细节感兴趣时......) http://dev.libqxt.org/libqxt/wiki/Meta_Object_Format

将此与 QMetaObject 的文档结合起来,事情应该会变得清晰......

4

2 回答 2

2

有多种方法可以将信号连接到方法(信号/插槽)。

但是,它们都围绕获得正确的方法编号。

在您拥有正确的方法编号和调用它的对象之后,您只需在 QObject 中调用一个虚拟化函数(qt_metacall),它会从给定的编号中找到要调用的正确方法。您可以在 MOC 生成的文件中找到此功能。此外,在生成的文件中,您可以找到创建类的静态 QMetaObject 的行。该对象将您的插槽名称和信号注册到方法编号。

这些可能会提供一些有趣的东西来阅读:

http://doc.qt.io/qt-5/qmetaobject.html
http://doc.qt.io/qt-5/metaobjects.html
http://doc.qt.io/qt-5/signalsandslots。 html

您还可以通过使用调试器运行插槽激活来学习很多东西。

于 2011-03-14T12:01:02.137 回答
0

基本上信号和槽的工作方式类似于Objective-C 中的消息

宏使预处理器用一些代码替换它们,这些代码“注册”和“查找”在调用插槽时要有效执行的函数/方法。

这允许更大的灵活性,因为发出信号或调用插槽的代码不需要了解使用它们的其他代码模块的太多信息。每个插槽和信号都会生成一个签名,该签名在运行时被查找然后被调用。

如果您熟悉 C/C++,您可以将其与动态库进行比较。在运行时查找符号,然后使用它们的地址让 CPU “跳转”到它们执行。

此外,这些链接可能会对您有所帮助:

于 2011-03-14T11:37:50.053 回答