我有3個進程:A
,B
和Final
。 Final
取決於A
和B
,並且只有在A
和B
都更新後才能更新。有一個信號dataChanged
,它更新了A
和B
(還有Final
)。插槽update_A
和update_B
也被其他信號調用。Qt - 僅當發射兩個信號時調用插槽
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;
}
}
反正是有信號與AND運算結合起來,擺脫掉使用pA
和pB
?還是我以錯誤的方式使用信號和插槽?
編輯:對不起,我忘了提及:update_A
和update_B
也被其他信號調用,所以我必須保持它們作爲獨立的插槽。我更新了上面的問題和代碼。
是update_A和update_B阻塞?是一個線程中的所有對象?因爲插槽是按照它們連接的順序調用的,所以一旦update_A完成,update_B將始終被調用。如果在另外兩個連接之後將最後一個插槽連接到dataChanged,那麼一旦update_B完成,插槽將被調用 –
爲什麼不使用調用這些函數的單個插槽(這又可以返回'bool'來檢查狀態)並且僅如果所有函數都成功,調用'Finish' – ramtheconqueror
由於插槽也連接到其他信號,我不能將它們組合。 'dataChanged'只是一個調用兩者的信號。有信號只調用其中一個槽,但是一旦兩個槽都被調用,'update_final'也必須被調用。 – scmg