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.

5voto

Nicolas Holthaus Punkte 7211

Alle bisherigen Antworten sind falsch.

Ein Signal kann privat gemacht werden, indem ein QPrivateSignal Typ als letztes Argument an seine Definition an:

signals:

  void mySignal(QPrivateSignal);

QPrivateSignal ist eine private Struktur, die in jeder QObject Unterklasse durch die Q_OBJECT Makro, so dass Sie nur Folgendes erstellen können QPrivateSignal Objekte in der aktuellen Klasse.

Technisch gesehen ist das Signal immer noch öffentlich sichtbar, aber es kann nur von der Klasse ausgesendet werden, die es erzeugt hat.

2voto

Th. Thielemann Punkte 2391

Sie können dafür das PIMPL-Muster verwenden. Ihre privaten Signale existieren nur in der privaten Implementierung.

0 Stimmen

Würde ein PIMPL, das von QObject abgeleitet ist, es nicht schwerer machen und die Leistung verschlechtern?

2 Stimmen

Ja, es braucht etwas Zeit. Aber bedenken Sie die folgenden Fragen: Wie viel Zeit kostet es, ein Unterprogramm aufzurufen? Ist der zugehörige Programmteil leistungsrelevant?

0 Stimmen

Ich bin mir nicht sicher, warum dies abgelehnt wurde. Ich verwende diesen Ansatz erfolgreich, zum Beispiel für einen Zustandsautomaten-Wrapper, der intern einen QStateMachine verwendet, ihn aber nicht offenlegt (aus architektonischen Gründen). Ebenso möchte ich die Signale, die verwendet werden, damit der Zustandsautomat seine Übergänge durchführt, nicht offenlegen, da diese Signale sonst mit den öffentlichen API-Signalen verwechselt würden, was die Wartbarkeit beeinträchtigen würde. Da der Zustandsautomat nur bei Benutzerinteraktionen übergeht, sind die Auswirkungen auf die Leistung in meinem Fall völlig irrelevant.

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