2010-05-09 40 views
5

我在其中一個對象中有兩個QObject子類的實例和兩個QMetaMethod實例,另一個對象中有一個槽。我想將這個信號和插槽連接起來。如何在QObject中使用QMetaMethod :: connect

我查看了qobject.h文件,發現SIGNAL()和SLOT()宏只是在方法簽名的開頭添加了「1」或「2」字符,所以它看起來應該是可能的將相同的字符添加到由QMetaMethod :: signature()返回的字符串的開頭,但這種方法依賴於某些未公開的工具包內部結構,並可能隨時被新版本的Qt破壞。

有沒有人知道通過QMetaMethod反射表示法連接信號和插槽的可靠方法?

編輯:Qt中的問題跟蹤 我已經創建了建議: https://bugreports.qt.io/browse/QTBUG-10637 如果有人也有興趣在此功能,您可以投票給這張票那裏。

回答

1

看起來像沒有辦法讓它工作而不依賴於內部實現。如果我是你,我會向Qt bug tracker提交功能請求,編寫一個模擬當前行爲SIGNAL/SLOT宏的代碼,並添加在SIGNAL/SLOT行爲改變時將失敗的單元測試。

對於您試圖解決的問題,可能有一個更簡單的解決方案:描述您在沒有任何實施細節的情況下究竟做了什麼。

+0

看起來你是對的。我會嘗試在Qt-interest郵件列表中詢問,如果沒有答案,我會填寫一個願望清單條目。 – VestniK 2010-05-10 13:46:19

+0

我有一些生成的代理類,它們在調用插槽時創建和發送RPC請求,並在通過網絡接收到一些RPC請求時發出信號(這是我自己的小型開源庫http://qremotesignal.googlecode.com)。我想添加一個函數,它可以自動將代理類中的所有RPC共享信號和插槽與某個目標類的信號和插槽相連接,這些目標類在使用此庫的應用程序中進行實際工作。 – VestniK 2010-05-10 13:52:09

0

如果簽名方法在QMetaMethod中是公開的,那麼結果不應該被惡魔破壞,並且使用它是安全的(文檔在使用QMetaMethod ::簽名方法時沒有提及「危險」)。我認爲你可以安全地使用它。可以肯定的是,你現在使用的是什麼版本的Qt?

+0

不完全正確。由於在QObject :: connect文檔中有人說,對於信號和插槽參數,應該使用SIGNAL()和SLOT()宏,我不能只使用QMetaMethod :: signature()函數。這些宏輸出與QMetaMethod :: signature()輸出不同。在這種情況下最糟糕的是,這些宏不能與運行時計算的字符串一起使用。 – VestniK 2010-05-10 09:46:27

+0

我正在使用Qt 4.6.2(Ubuntu 10.04官方存儲庫中提供的最新版本) – VestniK 2010-05-10 09:50:53

11

這已被固定爲Qt的4.8.0的:

https://bugreports.qt.io/browse/QTBUG-10637

假設我們有一個QObject * m_subject,並希望的屬性的變化通知信號連接到的PropertyChanged()槽:

const QMetaObject* meta = m_subject->metaObject(); 
QMetaProperty prop = meta->property(meta->indexOfProperty("myProperty")); 
if (prop.hasNotifySignal()) { 
    QMetaMethod signal = prop.notifySignal(); 
    QMetaMethod updateSlot = metaObject()->method(
     metaObject()->indexOfSlot("propertyChanged()")); 
    connect(m_subject, signal, this, updateSlot); 
} 

我成功地用它來製作一個QWidget子類,可以發現任何的QObject的所有屬性,併爲他們每個人的QLineEdit的,與連接保持更新QLineEdit的,只要相應的財產查nges。 (因爲我沒有找到將propertyID值傳遞給propertyChanged()的方法,所以有必要製作一個QLineEdit的子類並在其中實現propertyChanged()。QSignalMapper沒有幫助,因爲所有屬性都是相同的對象)。

+2

是的,它被我自己發給Qt的補丁修復了:) – VestniK 2012-09-20 05:29:02

相關問題