从 IniFormat 和 UserScope 创建的全局 QSettings 对象
Posted
技术标签:
【中文标题】从 IniFormat 和 UserScope 创建的全局 QSettings 对象【英文标题】:Global QSettings object created from IniFormat and UserScope 【发布时间】:2011-11-18 16:56:55 【问题描述】:我正在尝试将 QSettings 对象与 IniFormat 一起用于在应用程序启动时加载的 UserScope 设置。我将 QSettings 设置代码移动到一个单独的方法中,并从 main() 调用它,如以下 sn-p 所示:
#include <QDebug>
#include <QSettings>
#include <QStringList>
void loadSettings()
qDebug() << "[BEGIN] loadSettings()";
QCoreApplication::setOrganizationName("Org");
QCoreApplication::setApplicationName("App");
QSettings settings(QSettings::IniFormat,
QSettings::UserScope,
"Org",
"App");
settings.setValue("TheAnswer", "42");
QStringList keys = settings.allKeys();
qDebug() << "Loaded " << keys.size() << " keys.";
qDebug() << "[END] loadSettings()";
int main(int argc, char *argv[])
QApplication a(argc, argv);
loadSettings();
QSettings settings;
QStringList keys = settings.allKeys();
qDebug() << "Settings has " << keys.size() << " keys.";
// Empty
qDebug() << settings.value("TheAnswer").toString();
return a.exec();
结果输出是:
[开始] loadSettings() 已加载 1 把钥匙。 [END] loadSettings() 设置有 0 个键。 ""
查看documentation for QSettings,它指出使用 QCoreApplication 设置组织名称和应用程序名称将允许从应用程序的任何位置使用便捷的 QSettings 创建方法,所以我的理解是代码 sn- p 应该能够访问由 loadSettings() 方法加载的键“TheAnswer”存储的值。然而,当我使用便捷方法创建一个新的 QSettings 对象时,它没有键/值对。我验证了ini文件已创建并具有正确的数据。我错过了什么?
【问题讨论】:
【参考方案1】:我认为问题在于默认格式是QSettings::NativeFormat
,而不是您正在使用的QSettings::IniFormat
。
我注意到有一个静态 QSettings::setDefaultFormat()
函数,所以我会尝试将它添加到您的 loadSettings() 函数中:
QSettings::setDefaultformat( QSettings::IniFormat );
另外,一旦你设置了应用程序/组织和默认格式,我认为你不需要在 loadSettings(
) 函数中将任何参数传递给 QSetting
s 构造函数。
【讨论】:
您的建议解决了我的问题。鉴于 the constructor 声明传递 QSettings::IniFormat 将导致它使用 the IniFormat,我感到很惊讶。 构造函数将导致 QSettings 对象的该实例使用 IniFormat,但要通知其他 QSettings 实例也使用它,那么您需要使用该 setDefaultFormat 调用。以上是关于从 IniFormat 和 UserScope 创建的全局 QSettings 对象的主要内容,如果未能解决你的问题,请参考以下文章