在Qt5下,如何等待主事件循环执行连接到特定小部件的所有插槽?
具体来说,在以下示例中
class MyWidget : public QWidget {
~MyWidget() {
action_A();
}
void myclose() {
...
close();
}
};
...
auto* w = new MyWidget;
...
w->close();
action_B();
...
我想要这两个功能
action_A();
action_B();
以上述顺序执行。但是,没有进一步的预防措施,它们将以相反的顺序执行。
QWidget::close()
发出一个信号,最终触发MyWidget
实例的删除。但是,据我所知,这只会在控件返回主事件循环后发生。无论如何,在我们打电话给action_B()
之前不会发生这种情况。
相关讨论没有帮助:
QDialog
,接受的答案建议使用QDialog::exec()
。然而,Qt5文档建议避免QDialog::exec()
支持QDialog::open()
。由于这个原因和其他原因,我无法避免对QDialog::close()
的呼吁。QDialog::exec()
。只需将MyWidget
的destroyed()
信号连接到action_B
(或称为它的东西)。由于action_A
是从MyWidget
的析构函数调用的,所以在destroyed()
发出~QObject()
信号之前会调用它,因此,action_B
称之为。
请注意,你无法控制action_A
调用的时间,只要它来自MyWidget
的析构函数,所以推迟调用action_B
是你唯一的选择,即你不能让w->close(); action_B();
工作。
为什么你认为应该按顺序调用action_A()
和action_B()
?
一旦调用析构函数,QObject
将不再接收任何新信号(除了在d-tor执行期间发出的信号),因为它不存在并且所有信号和插槽将被断开。
由于action_A()
是从析构函数调用而action_B()
不是,action_A()
被执行为最后。
请注意,close
可能(不必)调用deleteLater
来销毁窗口,这个东西会在事件循环中调度对象的破坏。