2016-07-04 82 views
2

我有3個進程:ABFinalFinal取決於AB,並且只有在AB都更新後才能更新。有一個信號dataChanged,它更新了AB(還有Final)。插槽update_Aupdate_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運算結合起來,擺脫掉使用pApB?還是我以錯誤的方式使用信號和插槽?

編輯:對不起,我忘了提及:update_Aupdate_B也被其他信號調用,所以我必須保持它們作爲獨立的插槽。我更新了上面的問題和代碼。

+0

是update_A和update_B阻塞?是一個線程中的所有對象?因爲插槽是按照它們連接的順序調用的,所以一旦update_A完成,update_B將始終被調用。如果在另外兩個連接之後將最後一個插槽連接到dataChanged,那麼一旦update_B完成,插槽將被調用 –

+0

爲什麼不使用調用這些函數的單個插槽(這又可以返回'bool'來檢查狀態)並且僅如果所有函數都成功,調用'Finish' – ramtheconqueror

+0

由於插槽也連接到其他信號,我不能將它們組合。 'dataChanged'只是一個調用兩者的信號。有信號只調用其中一個槽,但是一旦兩個槽都被調用,'update_final'也必須被調用。 – scmg

回答

1

不,Qt中沒有提供的信號組合運算符。你需要實現你自己的,你所做的一切,或類似:

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

如果你經常使用這種模式,它可能是值得的定義與邏輯運算對信號序列的唯一責任的對象類。要完成,你需要'A之前的B'和'A之後的B'操作員。

+0

你能給我舉一個這樣的課的例子嗎? – scmg

+0

不,我不會舉一個例子 - 你有邏輯,而只是把相關的代碼分離出它自己的類。除非您的整個應用程序是通過將信號處理程序串聯起來組合在一起(在這種情況下,您應該閱讀Qt的狀態機框架,我認爲),否則甚至不值得付出努力。 –