我有一个静态类,希望它有静态QSettings
。
但是在初始化时我收到了警告:
QSettings* MySQLConnection::settings = new QSettings(QApplication::applicationDirPath() + "/config.ini", QSettings::IniFormat);
QCoreApplication :: applicationDirPath:请先实例化QApplication对象
作为一种解决方法,我在main函数的开头手动初始化QSetting
。有没有更好的方法来初始化我的静态成员?
谢谢!
答案 0 :(得分:7)
理想情况下,您应该没有任何类型的静态类实例。单身人士应该在main()
中有一个本地实例,他们的静态方法应该通过一个指向常规方法的实例指针。请参阅QCoraApplication
如何做一个好例子。
在任何情况下,QSettings
实例都可以是短暂的。它只是设置机制的一个句柄。使它静止或保持它没有多大意义。将QSettings
作为函数中的局部变量是正常的。
答案 1 :(得分:1)
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
类的实例(在本例中为QApplication
的实例),否则我认为它不会像您期望的那样工作。
从上面的文档中注意,建议尽快创建这样的类:
通常,我们建议您尽早在main()函数中创建QCoreApplication,QGuiApplication或QApplication对象。 exec()在事件循环退出之前不会返回;例如,当调用quit()时。
这意味着甚至在您尝试访问QApplication::applicationDirPath()
之前,当然
否则,在使用QSettings
时,您将无法从该方法获得正确的路径。