请首先实例化QApplication对象

时间:2016-08-19 13:55:38

标签: c++ qt static-members qapplication qcoreapplication

我有一个静态类,希望它有静态QSettings。 但是在初始化时我收到了警告:

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

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

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

谢谢!

2 个答案:

答案 0 :(得分:7)

理想情况下,您应该没有任何类型的静态类实例。单身人士应该在main()中有一个本地实例,他们的静态方法应该通过一个指向常规方法的实例指针。请参阅QCoraApplication如何做一个好例子。

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

答案 1 :(得分:1)

QApplication来自QCoreApplicationsources可以看出,applicationDirPath定义为:

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

    // ... more code
}

通过深入研究代码,我们发现selfinit函数初始化,由构造函数调用。
因此,除非您明确创建了Q*Application类的实例(在本例中为QApplication的实例),否则我认为它不会像您期望的那样工作。

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

  

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

这意味着甚至在您尝试访问QApplication::applicationDirPath()之前,当然 否则,在使用QSettings时,您将无法从该方法获得正确的路径。