请先实例化 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
.
时,您将无法从该方法获得正确的路径
我有一个静态 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
.