2011-03-14 91 views
2

我一直都是Qt程序员,现在已经有相当一段时间了,我明白了Qt的大部分特性。我仍然对连接语句在运行时如何将信号连接到插槽感到困惑。基本上我想了解编译时会发生什么,以及运行时会发生什么。QT中的信号和插槽之间的连接如何?

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

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

编辑: 这个链接会给你一个更好的主意。(仅如果你有兴趣在血淋淋的细节...) http://dev.libqxt.org/libqxt/wiki/Meta_Object_Format

夫妇这与文档QMetaObject和东西应该变得清晰...

回答

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

你也可以学到很多东西通过运行以为插槽激活一个调试器。

+0

谢谢对于答案..我可以看到生成在moc文件中的qt_metacall函数....但源对象的moc文件只包含关于信号的信息而非插槽......所以它如何找到插槽? – maxpayne 2011-03-14 12:19:27

+0

如果我理解,我不确定。插槽和信号通过在MOC文件中生成的静态元对象进行注册。 MOC文件是否没有列出您的插槽?它应该,我的。这可能会让人困惑,因为信号和插槽都堆积在一起。你能否给我一个更透彻的解释,以便我能理解。 – 0xbaadf00d 2011-03-14 13:34:18

0

基本上信号和插槽的工作原理与Objective-C中的消息类似。

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

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

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

而且,这些链接可以帮助你:

+0

谢谢你的答案..我正在寻找明确的细节..我很熟悉QT文档和其他posts.i我特别感兴趣的是如何以及在哪里生成的签名被查询运行时间和什么角色元对象在这个.. – maxpayne 2011-03-14 11:46:19

+0

这个怎么样? http://doc.qt.nokia.com/latest/signalsandslots.html#meta-object-information以及这个http://doc.qt.nokia.com/latest/metaobjects.html#meta-object-system – BastiBen 2011-03-14 11:58:48