在主事件循环之前如何创建一些对象?

Posted

技术标签:

【中文标题】在主事件循环之前如何创建一些对象?【英文标题】:How some objects are created before main event loop? 【发布时间】:2018-09-22 08:32:38 【问题描述】:

在调试时,我想出了对我来说很奇怪的事情。在主函数中,我将窗口的创建注释如下:

#include <QApplication>
#include <QMetaType>
#include <QDebug>

//#include "mainwindow.h"

int main(int argc, char *argv[])

    qDebug() << "Creating QApplication";
    QApplication a(argc, argv);
    qDebug() << "QAplication has been created successfully";

    qDebug() << "Creating application window";
    // MainWindow w;
    qDebug() << "Displaying application window";
    // w.show();
    qDebug() << "Application window has been displayed successfully";

    return a.exec();

我以为我只是在创建一个事件循环并开始使用它。但输出让我感到惊讶:

"17:28:32.793" ButtonControl: contructor.
"17:28:32.807" GestureControl: contructor
Creating QApplication
QAplication has been created successfully
Creating application window
Displaying application window
Application window has been displayed successfully

我有ButtonControlGestureControl 类,前两行输出来自它们的构造函数。我在 MainWindow 类中使用的其他类中创建它们的对象。对我来说奇怪的是它们是在/没有 MainWindow 和事件循环之前创建的。即使我没有创建 QApplication 对象并调用它的 exec() 方法,他们的消息也会被打印出来。我尝试了 cleaning 和 running qmakerebuilding,但没有成功。这里发生了什么? ButtonControlGestureControl 类有什么问题?

环境:win7、Qt 5.10、MSVC 2015。


编辑

这是我的Control 课程:

class Control : public QObject

    Q_OBJECT
public:
    explicit Control(QObject *parent = nullptr);
    static ButtonControl *getButtonController() 
        return &buttonController;
    
    static GestureControl *getGestureController() 
        return &gestureController;
    

private:
    static ButtonControl buttonController;
    static GestureControl gestureController;
;

我在我的 MainWindow 中调用这个类。 (据我从 cmets 了解到,这段代码 sn-p 就足够了)

【问题讨论】:

可能是 QT 内部的一些静态实例? 没有看到您的课程的代码,我们怎么知道?请发帖minimal reproducible example。 是的,它们是 Control 类中的静态类。但我也不创建 Control 对象。 静态类实例在动态初始化阶段自动创建,通常发生在main 启动之前。 只需在ButtonControl: contructor 中设置一个断点,检查堆栈跟踪。 【参考方案1】:

在cmets之后,我做了一个小研究,发现this答案:

静态成员在main()之前被初始化,在main()中return之后按照创建的相反顺序销毁。

静态成员是静态分配的,它们的生命周期以程序开始和结束。

感谢所有评论的人。

【讨论】:

以上是关于在主事件循环之前如何创建一些对象?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 tkinter 事件“继续”或暂停不同的 while 循环?

如何在库函数中使用异步事件循环

动态创建元素的事件绑定?

进入Qt事件循环后如何自动执行方法?

使用 asyncio 时,如何让所有正在运行的任务在关闭事件循环之前完成

事件处理程序WinProc