49 Stimmen

private/öffentliche qt-Signale

Können Qt-Signale öffentlich oder privat sein? Kann ich interne Signale erstellen, die nur innerhalb der Klasse sichtbar sind?

Aktualisierung: Ich habe eine Klasse mit einigen internen Signalen. Wie kann ich diese Signale für andere Klassen unsichtbar machen (Kapselung & Information Hiding)?

0 Stimmen

Verwenden Sie in diesem Fall das PIMPL-Muster.

30voto

Andrei Vlasyuk Punkte 279

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

Das Schlüsselwort "signals" ist in qobjectdefs.h definiert (Zeile 69 wie bei Qt 4.6.1):

#   define signals protected

UPDATE: Signale sind nur protected bis einschließlich aller Nebenversionen von Qt 4. Ab Qt 5.0 sind sie public . Siehe https://stackoverflow.com/a/19130831 .

5 Stimmen

Ich glaube, Signale werden jetzt als public siehe hier stackoverflow.com/questions/19129133/

0 Stimmen

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

0 Stimmen

Die Änderung war erforderlich, um die C++11-Syntax in connect Funktionen, bei denen der Rückruf der Funktion anstelle eines benannten Signals oder Slots angegeben wird.

20voto

Nikita Krupenko Punkte 1077

Signale war protected in Qt4, in Qt5 sind sie public . Mit Qt5 können Sie sie erstellen private durch Hinzufügen von QPrivateSignal als letztes Argument. Mehr zu diesem Thema: http://woboq.com/blog/how-qt-signals-slots-work-part2-qt5.html

0 Stimmen

Netter Scherz: Das moc ignoriert den letzten Eintrag in der Signalsignatur, wenn der Name QPrivateSignal

19voto

Frank Osterfeld Punkte 24349

Ein üblicher Weg, z.B. in kdelibs, ist dieser:

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

   void somePrivateSignal();

Dadurch wird das Signal privat, d.h. es kann nur von der Klasse selbst, nicht aber von ihren Unterklassen ausgesendet werden. Damit das "private:" nicht Q_SIGNALS außer Kraft setzt (moc würde dann somePrivateSignal nicht als Signal sehen), befindet es sich in Q_MOC_RUN, das nur definiert ist, wenn moc läuft.

Editar: Dieser Ansatz funktioniert nicht für die mit Qt 5 eingeführten neuen Verbindungsarten ( connect(a, &A::someSignal, b, &B::someSlot) ), da sie die Zugänglichkeit des Signals voraussetzen.

0 Stimmen

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

1 Stimmen

Verflixt. Warum muss in C++ alles gehackt werden?

1 Stimmen

"Dieser Ansatz funktioniert nicht für die mit Qt 5 eingeführten neuen Verbindungsarten". -- kommt drauf an... Wenn man nur erlauben will, das Signal auch intern anzuschließen (wobei der Slot dann möglicherweise ein anderes, dann öffentliches Signal aussenden könnte), dann ist das ideal -- abgesehen davon, dass die alte Syntax immer noch eine Verbindung zu ihr zulässt...

14voto

gregseth Punkte 12517

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

Wie Andrei schon sagte, sind Signale nur eine Neudefinition von protected, was bedeutet, dass sie nur von der Klasse ausgegeben werden können, in der sie definiert sind.

Wenn Sie eine Klasse dazu bringen wollen, ein Signal von einer anderen Klasse auszusenden, müssen Sie ihr eine öffentliche Methode (oder einen Slot) wie diese hinzufügen:

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

6 Stimmen

Ich denke, dies ist keine Antwort auf die Frage des Auftraggebers. Er bezieht sich auf Signale, die nur von der Klasse gehört werden können, die sie definiert hat.

0 Stimmen

"sie können nur von der Klasse ausgegeben werden, in der sie definiert sind" ...oder von einer Freundesklasse ;)

0 Stimmen

Ich bin mir nicht sicher, ob das stimmt. Siehe hier: stackoverflow.com/questions/19129133/ Die docs cay Signale können von anderen Klassen ausgegeben werden, und sind immer öffentlich, nicht geschützt.

5voto

Kyle Lutz Punkte 7800

Qt-Signale sind öffentlich in dem Sinne, dass sich jedes Objekt mit jedem Signal verbinden kann.

2 Stimmen

Sie sind auch öffentlich in dem Sinne, dass jede andere Klasse sie ausgeben kann, da es sich um öffentliche Funktionen handelt. Dies kann sich gegenüber früheren Versionen von Qt geändert haben. siehe hier stackoverflow.com/questions/19129133/

0 Stimmen

Die objektorientierte Programmierung verwendet Kapselung, um den Zugriff auf interne Methoden und Daten zu vermeiden. Falls Signale nur für interne Zwecke bestimmt sind, sollten sie ebenfalls versteckt werden.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X