2012-12-21 22 views
2

昨天我正在Qt中進行一個項目的工作,所以我給一個我認爲是公開的插槽做了延遲調用。所以我寫道:專用插槽上的聲明不一致Qt

QTimer::singleShot(); 

調用該插槽,但最後我看到該插槽是私人的。

這可能是一個解決辦法,以私有槽:

QTimer::singleShot(0,class,SLOT(class::privateSlot())) 

爲什麼有這種不一致的聲明中的Qt?

+0

你是什麼意思爲'不一致'?您實際上可以通過Qt信號插槽系統(即間接)調用專用插槽。 –

+0

它被稱爲*私人*當它實際上是私人不是.. –

+6

是的。 http://doc.qt.digia.com/qt/signalsandslots.html「由於插槽是普通的成員函數,它們在直接調用時遵循正常的C++規則,但作爲插槽,它們可以由任何組件調用,而不管它的訪問級別,通過信號槽連接,這意味着從一個任意類的實例發出的信號可以導致在一個不相關類的實例中調用一個專用槽。這是一個記錄在案的Qt設計缺陷。 –

回答

2

@仇恨發動機的回答一點點加寬

瞭解,看看文件與源和前綴moc_(例如moc_my_class.cpp)的名稱。當您在類聲明中添加Q_OBJECT宏時,此文件由moc編譯器生成。該宏爲您的類聲明添加了幾個方法,moc_my_class.cpp包含了該方法的定義。

現在看方法MyClass::qt_metacall。這種方法可以從其他地方調用,因爲它是公開的。另一方面,它可以調用MyClass的私有方法,因爲它們屬於MyClass類。

有沒有神祕))