Qt - 仅在发出两个信号时调用时隙

时间:2016-07-04 15:30:41

标签: c++ qt signals-slots

我有3个流程:ABFinalFinal取决于AB,并且只有在更新AB时才能更新。信号dataChanged同时更新AB(以及Final)。其他信号也会调用插槽update_Aupdate_B

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也被其他信号调用,因此我必须将它们保留为独立的插槽。我更新了上面的问题和代码。

1 个答案:

答案 0 :(得分:1)

不,Qt中没有提供的信号组合运算符。您需要像以前一样实施自己的工作,或者像:

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

如果经常使用此模式,则可能值得定义一个对象类,其中唯一的责任是对信号序列进行逻辑运算。要完成,你会想要'A在B之前'和'A在B之后'运算符。