我有 3 个进程:A
、B
和 Final
。 Final
依赖于 A
和 B
并且只有当 A
和 B 都可以/必须更新
已更新。有一个信号 dataChanged
可以同时更新 A
和 B
(Final
也是如此)。插槽 update_A
和 update_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 运算符结合起来,以摆脱使用 pA
和 pB
的情况?还是我以错误的方式使用了信号和槽?
编辑:抱歉,我忘了提及:update_A
和 update_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/