【发布时间】:2016-07-04 15:30:41
【问题描述】:
我有 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 也被其他信号调用,所以我必须将它们保持为单独的插槽。我更新了上面的问题和代码。
【问题讨论】:
-
update_A 和 update_B 是否阻塞?所有对象都在一个线程中吗?因为插槽是按照它们连接的顺序调用的,所以一旦 update_A 完成,总是会调用 update_B。如果在其他 2 个连接后将最后一个插槽连接到 dataChanged,则一旦 update_B 完成,将调用该插槽
-
为什么不使用单个槽来调用这些函数(反过来又可以返回
bool来检查状态)并且只有在所有函数都成功时才调用Finish? -
由于插槽也连接到其他信号,我无法将它们组合起来。
dataChanged只是一个调用两者的信号。有些信号只调用其中一个槽,但一旦调用了两个槽,update_final也必须被调用。
标签: c++ qt signals-slots