2011-03-14 94 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