2009-12-20 109 views
20

對於下面類型的信號和時隙Qt信號和槽的參數類型,const引用限定符是否重要?

signals: 
    void textChanged(const QString &); 

public slots: 
    void setText(const QString & text) 

框TextChanged和的setText的參數的類型似乎工作常量&的invarable。與僅使用QString相比,常量和引用限定有什麼不同?

QObject::connect(a,SIGNAL(textChanged(QString)),b,SLOT(setText(QString))); 
QObject::connect(a,SIGNAL(textChanged(const QString &)),b,SLOT(setText(const QString &))); 

編輯: 我沒有注意到顯示錯誤消息,當存在信號或切口被用來不兼容的類型的輸出窗口。我認爲信號插槽機制能夠在編譯時檢測參數類型錯誤。

回答

24

Qt的檢查一個normalized signature,意思是

正常化減少空白到 最小,「移動常量」到前 酌情從值類型中刪除「常量」 和替換值常量 引用。

+0

有沒有任何文章可以完全解釋Qt如何實現信號和插槽機制?除了http://doc.trolltech.com/4.6/signalsandslots.html – yesraaj 2009-12-20 14:34:55

+0

您的意思完全是作爲更詳細的內容,還是作爲教程引導您完成,而是以另一種速度完成? – e8johan 2009-12-21 06:52:36

+0

與更多的細節,任何鏈接讚賞:) – yesraaj 2009-12-21 10:06:26

3

聲明:我的qt相當生鏽,但信號/槽機制仍然只是C++函數調用。如果信號/插槽機制實際上將對象複製到內部存儲中,我的道歉(您需要檢查Qt頁面,信號/插槽afaik上有一個很大的頁面) - 因爲下面的位只會在C++上下文中相關,不在C++ + Qt上下文中。

如果省略引用,字符串將被複制(並且使const無關緊要,對其所做的任何更改都將保留在函數中)。
如果您在引用中留下,但取出const,則允許該方法修改您提供的字符串。它們都可以工作,但可以對通過的對象做不同的事情(複製量/保留更改的可能性)。

我建議您閱讀以下資源:

(上const正確性)https://isocpp.org/wiki/faq/const-correctness

(上引用)https://isocpp.org/wiki/faq/references

準確瞭解傳遞參數,以及如何 void foo(const A&)/ / void foo(A&)/ void foo(A) 都是不同的。

+5

對於直接連接,建議通過const引用傳遞值以避免不必要的副本。 對於排隊連接,無論您如何傳遞參數,Qt都會創建副本。 – rpg 2009-12-21 09:25:27