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

问题描述 投票:1回答:2

在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()之前不会发生这种情况。

相关讨论没有帮助:

c++ qt event-loop
2个回答
2
投票

只需将MyWidgetdestroyed()信号连接到action_B(或称为它的东西)。由于action_A是从MyWidget的析构函数调用的,所以在destroyed()发出~QObject()信号之前会调用它,因此,action_B称之为。

请注意,你无法控制action_A调用的时间,只要它来自MyWidget的析构函数,所以推迟调用action_B是你唯一的选择,即你不能让w->close(); action_B();工作。


0
投票

为什么你认为应该按顺序调用action_A()action_B()

一旦调用析构函数,QObject将不再接收任何新信号(除了在d-tor执行期间发出的信号),因为它不存在并且所有信号和插槽将被断开。

由于action_A()是从析构函数调用而action_B()不是,action_A()被执行为最后。

请注意,close可能(不必)调用deleteLater来销毁窗口,这个东西会在事件循环中调度对象的破坏。

© www.soinside.com 2019 - 2024. All rights reserved.