c++ - Qt - 仅在发出两个信号时调用插槽

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

最佳答案

不,Qt 中没有提供信号组合运算符。你需要像你所做的那样实现你自己的,或者像:

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

如果您经常使用这种模式,那么定义一个对象类来单独负责对信号序列进行逻辑操作可能是值得的。为了完整起见,您还需要“A before B”和“A after B”运算符。

关于c++ - Qt - 仅在发出两个信号时调用插槽,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38188192/

相关文章:

c++ - 非阻塞控制台输入 C++

c++ - Linux API 列出正在运行的进程?

MSVC2012 上的 Qt5 - moc 步骤非常慢

QT Creator,编译和部署一个c或c++到远程设备(BeagleBone或R pi)

c++ - 我应该在 Qt 中尽可能多地使用信号/插槽吗?

python - 信号获取多个Qcomboxs的多个内容作为函数中的多个参数

c++ - 将 int(C::*)(int, char) 类型转换为 int(int, char) 类型

c++ - 没有配置文件来制作qt的静态版本

c# - (如何)是否可以绑定(bind)/重新绑定(bind)一个方法来与不同签名的委托(delegate)一起工作?

c++ - 将一个信号连接到两个插槽,但在 Qt 中一次只执行一个插槽