3

我有一个静态类,并希望它具有 static QSettings。但是随着我的初始化,我得到一个警告:

QSettings* MySQLConnection::settings = new QSettings(QApplication::applicationDirPath() + "/config.ini", QSettings::IniFormat);

QCoreApplication::applicationDirPath: 请先实例化QApplication对象

作为一种解决方法QSetting,我在 main 函数的开头手动初始化。有没有更好的方法来初始化我的静态成员?

谢谢!

4

2 回答 2

7

理想情况下,您不应该有任何类型的静态类实例。单例应该有一个本地实例,main()并且它们的静态方法应该通过实例指针转发到常规方法。看看它是如何QCoraApplication做的一个很好的例子。

在任何情况下,QSettings实例都可以是短暂的。它只是设置机制的一个句柄。让它静止或保持不变没有多大意义。在函数中QSettings作为局部变量是正常的。

于 2016-08-19T14:00:06.307 回答
2

QApplication源自QCoreApplication
正如您从源代码中看到的那样,applicationDirPath定义为:

QString QCoreApplication::applicationDirPath()
{
    if (!self) {
        qWarning("QCoreApplication::applicationDirPath: Please instantiate the QApplication object first");
        return QString();
    }

    // ... more code
}

通过深入代码,我们发现它self是由函数初始化的init,它是由构造函数调用的。因此,在我看来,除非您明确创建了一个类的实例(在本例中是 的实例)
,否则它不会像您期望的那样工作。Q*ApplicationQApplication

请注意上面的文档,建议尽快创建这样的类:

一般来说,我们建议您尽早在 main() 函数中创建 QCoreApplication、QGuiApplication 或 QApplication 对象。exec() 在事件循环退出之前不会返回;例如,当调用 quit() 时。

当然,这意味着甚至在您尝试访问之前QApplication::applicationDirPath()
否则在使用QSettings.

于 2016-08-19T14:07:22.327 回答