2016-07-04 5 views
2

Ich habe 3 Prozesse: A, B und Final. Final hängt sowohl von A als auch B ab und kann/muss nur aktualisiert werden, wenn sowohl A als auch aktualisiert werden. Es gibt ein Signal dataChanged, das sowohl A als auch B (und so auch Final) aktualisiert. Die Steckplätze update_A und update_B werden auch von anderen Signalen aufgerufen.Qt - Steckplatz nur aufrufen, wenn beide Signale ausgegeben werden

MainWindow::MainWindow(QWidget* parent) 
    : QMainWindow(parent), 
    pA(false), 
    pB(false) 
{ 
... 
connect(this, &MainWindow::xChanged, this, &MainWindow::update_A); 
connect(this, &MainWindow::yChanged, this, &MainWindow::update_B); 
connect(myObj, &MyClass::dataChanged, this, &MainWindow::update_A); 
connect(myObj, &MyClass::dataChanged, this, &MainWindow::update_B); 
connect(this, &MainWindow::a_Updated, this, &MainWindow::update_final); 
connect(this, &MainWindow::b_Updated, this, &MainWindow::update_final); 
... 
} 

void MainWindow::update_A() { 
    if (!this.pA) { 
    // do something 
    } 
    this.pA = true; 
    emit a_Updated; 
} 

void MainWindow::update_B() { 
    if (!this.pB) { 
    // do something 
    } 
    this.pB = true; 
    emit b_Updated; 
} 

void MainWindow::update_final() { 
    if (this.pA && this.pB) { 
    // do something 
    this.pA = false; 
    this.pB = false; 
    } 
} 

Gibt es trotzdem, um die Signale mit der AND-Operator zu kombinieren pA und pB loszuwerden verwenden? Oder habe ich Signale und Slots falsch verwendet?

EDIT: Entschuldigung, dass ich vergessen habe zu erwähnen: update_A und update_B werden auch von anderen Signalen aufgerufen, so dass ich sie als getrennte Steckplätze behalten muss. Und ich habe die Frage und den Code oben aktualisiert.

+0

sind update_A und update_B blockiert? Sind alle Objekte in einem Thread? Da Slots in der Reihenfolge aufgerufen werden, in der sie verbunden waren, wird update_B immer aufgerufen, sobald update_A beendet ist. Wenn Sie den finalen Slot mit dataChanged nach den anderen 2 Connects verbinden, wird der Slot aufgerufen, sobald update_B beendet ist. –

+0

Warum benutzen Sie nicht einen einzelnen Slot, der diese Funktionen aufruft (die wiederum 'bool' zurückgeben können, um den Status zu überprüfen) Rufen Sie 'Finish' auf, wenn alle Funktionen erfolgreich sind? – ramtheconqueror

+0

Da die Steckplätze auch mit anderen Signalen verbunden sind, kann ich sie nicht kombinieren. 'dataChanged' ist nur ein Signal, das beides aufruft. Es gibt Signale, die nur einen der Slots aufrufen, aber sobald beide Slots aufgerufen sind, muss auch der 'update_final' aufgerufen werden. – scmg

Antwort

1

Nein, in Qt gibt es keine Signalkombinationsoperatoren. Sie müssen Ihre eigenen implementieren, wie Sie getan haben, oder wie:

void MainWindow::update_A() { 
    if (!pA) { 
    // do something 
    } 
    pA = true; 
    if (pA && pB) 
     emit ab_Updated(); 
} 

Wenn Sie dieses Muster häufig verwenden, ist es sinnvoll sein kann, eine Objektklasse mit der alleinigen Verantwortung von logischen Operationen an Signalsequenzen zu definieren, . Um vollständig zu sein, würden Sie auch die Operatoren "A vor B" und "A nach B" möchten.

+0

können Sie mir bitte ein Beispiel für eine solche Klasse geben? – scmg

+0

Nein, ich werde kein Beispiel geben - Sie haben die Logik, und es ist nur eine Frage der Trennung des relevanten Codes in seine eigene Klasse. Es ist unwahrscheinlich, dass es sich überhaupt lohnt, wenn Sie Ihre gesamte Anwendung nicht durch Kombination von Signalhandlern zusammensetzen (in diesem Fall sollten Sie sich über Qt's State-Machine-Framework informieren, denke ich). –

Verwandte Themen