在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()
。答案 0 :(得分:2)
只需将MyWidget
的{{1}}信号连接到destroyed()
(或称为它的东西)。由于action_B
是从action_A
的析构函数中调用的,因此它将在MyWidget
中发出destroyed()
信号之前被调用,因此称为~QObject()
。 / p>
请注意,您无法控制action_B
的调用时间,只要它来自action_A
的析构函数,因此将调用延迟到MyWidget
是您唯一的选择,即您将无法使action_B
正常工作。
答案 1 :(得分:0)
为什么您应该依次调用action_A()
和action_B()
?
一旦调用了析构函数,QObject
将不再接收任何新信号(除了在d-tor执行期间发出的那些信号),因为它将不存在并且所有信号和插槽都将断开。
由于action_A()
是析构函数的调用,而action_B()
不是,所以action_A()
会最后执行。
请注意,close
可以(不必)调用deleteLater
来销毁窗口,而这可以安排在事件循环中销毁对象。