2010-01-26 171 views
26

qt信號可以公開還是私密?私人/公共qt信號

我可以創建內部信號嗎,只能在課堂上看到嗎?

加入: 我有一個類與一些內部信號。我怎樣才能讓這些信號 看不見其他類(封裝&信息隱藏)

在此先感謝, 安東

回答

4

Qt的信號是公衆在這個意義上,任何物體可以連接到任何信號。

+0

它們也是公共的,任何其他類都可以發出它們,因爲它們是公共函數。這可能已經改變了Qt的先前版本。看到這裏http://stackoverflow.com/questions/19129133/qt-signals-and-slots-permissions/19130567#19130567 – johnbakers 2013-10-02 05:41:02

19

否信號不能是公共或私人信號。 Qt信號是受保護的類方法。

「信號」 關鍵字將在qobjectdefs.h定義(線69作爲用於Qt的4.6.1):

# define signals protected 

UPDATE:信號僅protected高達和包括Qt 4的所有次要版本。從Qt 5.0起,他們是public。見https://stackoverflow.com/a/19130831

+2

我相信信號現在被認爲是「公共」看到這裏http://stackoverflow.com/questions/19129133/qt-signals-and-slots-permissions/19130567#19130567 – johnbakers 2013-10-02 05:40:15

+0

似乎可以有私人信號:http://doc.qt.io/qt-5/qstate.html#finished - 他們是如何創建的? – derM 2017-07-27 14:35:19

12

插槽是簡單的方法,可以是公開的,保護的或私人的。

正如Andrei指出的那樣,信號只是被保護的重新定義,意味着它們只能由它們所在的類所發出。

如果想使一個類從anoter一個發射的信號,則必須添加它的公共方法(或狹槽)像這樣的:

void emitTheSignal(...) { 
    emit theSignal(...); 
} 
+6

我認爲這不回答OP問題。他所指的信號只能由定義它們的類來監聽。 – Daniel 2011-07-22 19:33:49

+0

「他們只能由他們定義的班級發出」......或者是一個朋友班級。 ;) – weberc2 2013-06-24 17:28:20

+0

我不確定這是真的。請參閱:http://stackoverflow.com/questions/19129133/qt-signals-and-slots-permissions文檔可以從其他類發出信號,並且始終是公共的,不受保護。 – johnbakers 2013-10-02 02:35:10

15

的常用方法,例如在的kdelibs看到的,是這樣的:

Q_SIGNALS: 
#ifndef Q_MOC_RUN 
    private: // don't tell moc, doxygen or kdevelop, but those signals are in fact private 
#endif 

    void somePrivateSignal(); 

這使得信號私有的,即,它只能通過射出類本身而不是由它的子類。爲了不讓「private:」取代Q_SIGNALS(moc不會將某些私有信號看作是信號),它在Q_MOC_RUN中,它只在moc運行時才被定義。

編輯:這種方法不適用於引入Qt 5(connect(a, &A::someSignal, b, &B::someSlot))的新型連接,因爲它們需要信號可訪問。

+0

'private:Q_SIGNAL mySignal();'還能工作嗎? – leemes 2012-06-11 11:46:33

+0

沒有,如「#定義Q_SIGNALS保護」,私營:不會有任何效果 – 2013-01-09 22:20:01

+0

討厭鬼。爲什麼C++中的所有內容都需要黑客? – weberc2 2013-06-24 17:34:59