等待事件循环为空/等待Qt5小部件关闭

时间:2019-03-08 17:47:08

标签: c++ qt event-loop

在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()之前都不会发生。

无助的相关讨论:

2 个答案:

答案 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来销毁窗口,而这可以安排在事件循环中销毁对象。