2012-12-29 29 views
1

的Windows 7 SP1
MSVS 2010
Qt庫4.8.4的Windows(VS 2010)
Visual Studio的外接1.1.11對的Qt4爲什麼Qt不會在信號/插槽中產生無效的類名/類型名稱的編譯錯誤?

我,起初,無法弄清楚爲什麼這個插槽沒有觸發:

connect (lineEdit, SIGNAL(textChanged(const QString &)), 
     this, SLOT(enableFindButton(const Qstring &))); 

差異很明顯:Qstring應該是QString。

我的問題:爲什麼編譯?實際上,它會用這個編譯:

connect (lineEdit, SIGNAL(textChanged(const nonsense &)), 
     this, SLOT(enableFindButton(const more_nonsense &))); 

這是預期的行爲嗎?爲什麼這不會產生錯誤?

+0

http://stackoverflow.com/questions/5880763/qt-signal-slot-macro-declaration?lq=1(其中包括) –

+2

這僅僅是因爲MOC(元對象編譯器)不夠智能,無法推斷類型,但Qt應該在運行時產生一些警告信息,表示信號不能和插槽連接。 – doc

回答

6

就我所知,理解Qt是如何工作的,連接線在運行時工作,而不是在編譯時。這意味着當代碼流到達該部分時,所有連接信號和插槽所需的操作都會執行。

記住Qt的一些重要內容,其中一些調用只是宏而不是C++函數。例如,你應該在類聲明中添加「Q_OBJECT」行來啓用信號和插槽機制,這是一個宏。此外,connect調用是一個宏(...),emit是一個宏等。一旦MOC(預編譯器,將Qt宏轉換爲真實代碼)分析您的代碼,這些調用就會擴展爲真實代碼。

此外,據我所知,信號/插槽機制在運行時工作,而不是編譯時間。如果您閱讀連接宏的文檔,它會說您放置在那裏的「SIGNAL」和「SLOT」宏,將您放入其中的東西顯示爲一種字符串,顯然,這種格式可能過於複雜所以,由於它是一個在那裏工作的字符串,所以編譯無法檢查字符串是否正確,這是在運行時檢查的。

我希望我的壞英語讓你瞭解我,我希望我的知識足夠大,不要說(太多)不正確的老虎。

+2

雖然Q_OBJECT宏展開爲QMetaObject MOC似乎完全忽略SIGNAL/SLOT宏。信號和插槽的連接留給運行時間,並作爲簡單字符串匹配實現(SIGNAL和SLOT宏展開爲'const char *')。 – doc

+0

最後一句話+1 – rfcoder89

相關問題