2010-01-26 19 views
26

Kann qt Signale öffentlich oder privat sein?private/öffentliche QT-Signale

Kann ich interne Signale erstellen, die nur innerhalb der Klasse angezeigt werden?

hinzugefügt: Ich habe eine Klasse mit einigen internen Signalen. Wie kann ich diese Signale unsichtbar für andere Klassen (Verkapselung & Information Hiding) mache

Dank im Voraus, anton

Antwort

4

Qt Signale Öffentlichkeit in dem Sinne sind, dass jedes Objekt auf jedes Signal anschließen.

+0

sie sind auch öffentlich in dem Sinne, dass jede andere Klasse sie emittieren kann, da sie öffentliche Funktionen sind. Dies könnte sich gegenüber früheren Versionen von Qt geändert haben. Sehen Sie hier http://StackOverflow.com/Questions/19129133/qt-signals-and-slots-permissions/19130567#19130567 – johnbakers

19

Nein. Signale können nicht öffentlich oder privat sein. Qt-Signale sind geschützte Klassenmethoden.

"Signale" Schlüsselwort wird in qobjectdefs.h (Leitung 69 wie für Qt 4.6.1) definiert:

# define signals protected 

UPDATE: Signale sind nur protected bis zum alle kleineren Versionen von Qt 4. Ab Qt 5.0 sind sie public. Siehe https://stackoverflow.com/a/19130831.

+2

Ich glaube Signale werden jetzt als 'public' betrachtet siehe http://StackOverflow.com/Questions/19129133/qt-signals-and-slots-permissions/19130567 # 19130567 – johnbakers

+0

Es scheint, dass es private Signale geben kann: http://doc.qt.io/qt-5/qstate.html#finished - wie werden sie erstellt? – derM

12

Slots sind einfache Methoden, die öffentlich, geschützt oder privat sein können.

Wie Andrei darauf hingewiesen hat, sind Signale nur eine Neudefinition von geschützt, was bedeutet, dass sie nur von der Klasse, in der sie definiert sind, ausgesendet werden können.

Wenn Sie eine Klasse emittieren ein Signal von anoter machen möchten, haben Sie es eine öffentliche Methode (oder Schlitz) wie diese hinzu:

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

Ich denke, das beantwortet die OP-Frage nicht. Er bezieht sich auf Signale, die nur von der Klasse gehört werden können, die sie definiert hat. – Daniel

+0

"Sie können nur von der Klasse ausgegeben werden, in der sie definiert sind" ... oder eine Freundklasse. ;) – weberc2

+0

Ich bin mir nicht sicher, ob das stimmt. Siehe hier: http://stackoverflow.com/questions/19129133/qt-signals-and-slots-permissions Die Doc-Cay-Signale können von anderen Klassen ausgegeben werden und sind immer öffentlich, nicht geschützt. – johnbakers

15

Ein üblicher Weg, z.B. gesehen in kdelibs, dann ist dies:

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

    void somePrivateSignal(); 

Dies macht das Signal privat, das heißt es nur von der Klasse emittiert werden kann sich aber nicht von ihrer Unterklassen. Um das "private:" nicht zu deaktivieren, wird Q_SIGNALS (moc würde dann einigePrivateSignal nicht als Signal sehen), es ist in Q_MOC_RUN, das nur definiert wird, wenn moc läuft.

Edit: Dieser Ansatz funktioniert nicht für die mit Qt 5 (connect(a, &A::someSignal, b, &B::someSlot)) eingeführten new-style connects, da sie das Signal benötigen, um zugänglich zu sein.

+0

Funktioniert 'private: Q_SIGNAL mySignal();' auch? – leemes

+0

Nein, als "#define Q_SIGNALS protected", das private: hat keinen Effekt –

+0

Drat. Warum benötigt alles in C++ einen Hack? – weberc2