请先实例化 QApplication 对象

Please instantiate the QApplication object first

我有一个静态 class 并希望它具有静态 QSettings。 但是在初始化时我收到警告:

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

QCoreApplication::applicationDirPath: Please instantiate the QApplication object first

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

谢谢!

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

无论如何,QSettings 实例可以是短暂的。它只是设置机制的句柄。使它静止或保持它周围没有多大意义。 QSettings作为函数中的局部变量是正常的。

QApplication 派生自 QCoreApplication.
sources可以看出,applicationDirPath定义为:

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

    // ... more code
}

通过深入研究代码,我们发现 self 是由构造函数调用的 init 函数初始化的。
因此,在我看来,它不会像您期望的那样工作,除非您明确创建了 Q*Application class 的实例(在这种情况下, [=11 的实例=]).

从上面的文档中注意到,建议尽快创建这样一个class:

In general, we recommend that you create a QCoreApplication, QGuiApplication or a QApplication object in your main() function as early as possible. exec() will not return until the event loop exits; e.g., when quit() is called.

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

时,您将无法从该方法获得正确的路径