2016-05-26 8 views
0

Ich suche nach einer Möglichkeit, eine Art Signalübertragung mit Qt zu haben. In meinem Entwurf bekam ich ein Auth Objekt, das in c verwendet werden kann ++ und QML Seite:Broadcast ein Qt-Signal zu Instanzen jedes Objekts

class Auth : public QObject 
{ 
    Q_OBJECT 
public: 
    Auth() ; 

    Q_INVOKABLE bool isLogged() const ; 

    Q_INVOKABLE void reconnect() ; 

    Q_INVOKABLE void login(QString mail, QString password) ; 

    Q_INVOKABLE void logout() ; 

protected: 
    static QString token_ ; 

signals: 
    void error(QString message) ; 
    void logged() ; 
    void loggedOut() ; 
}; 

Wenn loginlogged() Signale dann aufgerufen wird, werden gefeuert und loggedOut() Signal für logout().

1- Im qml Teil i diesen Code haben:

Auth { 
    id: auth 
    onError: console.log("auth error") 
    onLogged: console.log("auth logged") 
    onLoggedOut: console.log("auth logged out") 
} 

2- Und in der C++ Seite ich in einigen Fehlerfällen tun kann:

Auth auth ; 
auth.logout() ; 

Die beiden Auth Objekte von 1 und 2 sind nicht die gleichen, so dass die loggedOut von einem emittiert wird nicht in den anderen entlassen, das ist in Ordnung.

Nun, was ich versuche, ist eine Möglichkeit, das loggedOut Signal an alle Instanzen von Auth zu senden. Ich möchte vermeiden, eine gemeinsame Instanz von Auth zwischen C++ und qml Seite zu teilen.

Gibt es einen Standard Weg dies zu tun?

Antwort

0

Ich glaube nicht, da Sie im Wesentlichen nach einer Qt/C++ - Methode suchen, um alle Instanzen einer bestimmten Klasse (Auth, in diesem Fall) zu finden. Siehe z.B. this oder this.

Abhängig von vielen anderen Faktoren, könnten Sie:

  • halten eine statische Liste aller Klasseninstanzen innerhalb des Auth Objekt und verbinden die verschiedenen Instanzen innerhalb Auth::Auth()
  • manuell verbinden Auth::loggedOut() zum ersten Auth Objekt zu allen anderen Instanzen (Hinweis: Vorsicht, wenn Sie eine zirkuläre Verbindung erhalten, werden Sie eine Endlosschleife eingeben).
  • machen Auth einen Singleton (obwohl ich, dass Ihre Verletzung betrachten würde Bedingung „keine Instanz teilen“)

Es gibt wohl andere ist (vielleicht besser) zu Optionen.

+0

Ich habe die erste Methode implementiert. Ich dachte daran, auf die zweite umzusteigen, aber sie sind nicht genau gleichwertig, es scheint, als würde ich die Fähigkeit verlieren, ein Ereignis auf eine bestimmte Instanz auszulösen. – Falco