QSettings类提供持久的独立于平台的应用程序设置。
头文件: | #include< QSettings > |
qmake: | QT + =core |
继承(父): | QObject |
0:使用最适合平台的存储格式存储设置。
在Windows上,这意味着系统注册表;
在macOS和iOS上,这意味着CFPreferences API在Unix上,这意味着INI格式的文本配置文件。(PC平台QSettings::NativeFormat )
1:将设置保存在INI文件中。注意,INI文件失去了数字数据和用于编码它们的字符串之间的区别,所以写为数字的值应该作为QString读回。(嵌入式平台QSettings::IniFormat )
在Unix上,NativeFormat和IniFormat意思相同,只是文件扩展名不同(。用于NativeFormat的配置。ini格式的ini)。
enum Format { NativeFormat, Registry32Format, Registry64Format, IniFormat, InvalidFormat }
0:将设置存储在特定于当前用户的位置(例如,在用户的主目录中)。
1:将设置存储在全局位置,以便同一台计算机上的所有用户都可以访问同一组设置。
enum Scope { UserScope, SystemScope }
0:没有发生错误。
1:出现访问错误(例如,试图写入只读文件)。
2:出现格式错误(例如,加载格式错误的INI文件)。
enum Status { NoError, AccessError, FormatError }
注意点
INI文件格式对键的语法有严格的限制。Qt通过在键中使用%作为转义字符来解决这个问题。此外,如果您保存一个顶级设置(一个没有斜杠的键,例如“someKey”),它将出现在INI文件的“General”部分。为了避免覆盖其他键,如果您使用像“General/someKey”这样的键来存储内容,该键将位于“%General”部分,而不是“General”部分。
遵循我们应该在接受的内容上开明,在生成的内容上保守的原则,QSettings将接受Latin-1编码的INI文件,但生成纯ASCII文件,其中非ASCII值使用标准INI转义序列进行编码。为了提高INI文件的可读性(但可能不太兼容),可以调用setIniCodec()。
返回类型 | 函数 |
---|---|
构造函数 | QSettings(QSettings::Scope scope, QObject *parent = nullptr) |
构造函数 | QSettings(QObject *parent = nullptr) |
构造函数 | QSettings(const QString &fileName, QSettings::Format format, QObject *parent = nullptr) |
构造函数 | QSettings(QSettings::Format format, QSettings::Scope scope, const |
构造函数 | QSettings(QSettings::Scope scope, const QString &organization, const |
构造函数 | QSettings(const QString &organization, const QString &application = QString(), QObject *parent = nullptr) |
virtual | ~QSettings() |
QStringList | allKeys() const |
QString | applicationName() const |
void | beginGroup(const QString &prefix) |
int | beginReadArray(const QString &prefix) |
void | beginWriteArray(const QString &prefix, int size = -1) |
QStringList | childGroups() const |
QStringList | childKeys() const |
void | clear() |
bool | contains(const QString &key) const |
void | endArray() |
void | endGroup() |
bool | fallbacksEnabled() const |
QString | fileName() const |
QSettings::Format | format() const |
QString | group() const |
QTextCodec * | iniCodec() const |
bool | isAtomicSyncRequired() const |
bool | isWritable() const |
QString | organizationName() const |
void | remove(const QString &key) |
QSettings::Scope | scope() const |
void | setArrayIndex(int i) |
void | setAtomicSyncRequired(bool enable) |
void | setFallbacksEnabled(bool b) |
void | setIniCodec(QTextCodec *codec) |
void | setIniCodec(const char *codecName) |
void | setValue(const QString &key, const QVariant &value) |
QSettings::Status | status() const |
void | sync() |
QVariant | value(const QString &key, const QVariant &defaultValue = QVariant()) const |
返回类型 | 函数 |
---|---|
QSettings::Format | defaultFormat() |
QSettings::Format | registerFormat(const QString &extension, QSettings::ReadFunc readFunc, QSettings::WriteFunc writeFunc, Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive) |
void | setDefaultFormat(QSettings::Format format) |
void | setPath(QSettings::Format format, QSettings::Scope scope, const QString &path) |
构造函数
QSettings::QSettings(const QString &organization, const QString &application = QString(), QObject *parent = nullptr)
代码
QSettings settings("Moose Soft", "Facturo-Pro");
相当于
QCoreApplication::setOrganizationName("Moose Soft");
QCoreApplication::setApplicationName("Facturo-Pro");
QSettings settings;
常用构造函数
QSettings::QSettings(const QString &fileName, QSettings::Format format, QObject *parent = nullptr)
构造一个QSettings对象,用于访问存储在名为文件名,带父级父母。如果该文件尚不存在,则创建该文件。
如果格式是
QSettings::NativeFormat
,的意思文件名取决于平台。在Unix上,文件名是INI
文件的名称。在macOS和iOS上,文件名是的名称.plist
文件。在Windows上,文件名是系统注册表中的路径。如果格式是QSettings::IniFormat, 文件名是INI文件的名称。
构造函数
QSettings::QSettings(QSettings::Format format, QSettings::Scope scope, const QString &organization, const QString &application = QString(), QObject *parent = nullptr)
如果范围是
QSettings::UserScope
,QSettings对象首先搜索用户特定的设置,然后作为后备搜索系统范围的设置。
如果范围是QSettings::SystemScope
,QSettings对象忽略用户特定的设置,并提供对系统范围设置的访问。如果格式是
QSettings::NativeFormat
本机API用于存储设置。如果格式是QSettings::IniFormat
,则使用INI
格式。如果没有给出应用程序名称,QSettings对象将只访问整个组织位置.
析构函数
QSettings::~QSettings()
任何未保存的更改最终都将被写入永久存储。
获取所有键
QStringList QSettings::allKeys() const
例子:可以存储颜色,点,布尔等等
QSettings settings;
settings.setValue("fridge/color", QColor(Qt::white));
settings.setValue("fridge/size", QSize(32, 96));
settings.setValue("sofa", true);
settings.setValue("tv", false);
QStringList keys = settings.allKeys();
// keys: ["fridge/color", "fridge/size", "sofa", "tv"]
如果使用beginGroup()设置组,则只返回组中的键,而不返回组前缀:
settings.beginGroup("fridge");
keys = settings.allKeys();
// keys: ["color", "size"]
开始一个组
void QSettings::beginGroup(const QString &prefix)
向当前组追加前缀。 当前组自动添加到指定给QSettings的所有键的前面。此外,查询函数如childGroups()、childKeys()和allKeys()都是基于组的。默认情况下,不设置任何组。 群组有助于避免反复键入相同的设置路径。例如:
settings.beginGroup("mainwindow");
settings.setValue("size", win->size());
settings.setValue("fullScreen", win->isFullScreen());
settings.endGroup();
settings.beginGroup("outputpanel");
settings.setValue("visible", panel->isVisible());
settings.endGroup();
调用endGroup()将当前组重置为对应的beginGroup()调用之前的状态。组可以嵌套。
向当前组添加前缀,并开始从数组中读取。返回数组的大小。
int QSettings::beginReadArray(const QString &prefix)
struct Login {
QString userName;
QString password;
};
QList<Login> logins;
...
QSettings settings;
int size = settings.beginReadArray("logins");
for (int i = 0; i < size; ++i) {
settings.setArrayIndex(i);
Login login;
login.userName = settings.value("userName").toString();
login.password = settings.value("password").toString();
logins.append(login);
}
settings.endArray();
向当前组添加前缀,并开始写入大小为size的数组。如果size为-1(默认值),则根据写入条目的索引自动确定。 如果某一组键出现了很多次,可以使用数组来简化操作。例如,假设您想要保存一个可变长度的用户名和密码列表。然后你可以写:
void QSettings::beginWriteArray(const QString &prefix, int size = -1)
struct Login {
QString userName;
QString password;
};
QList<Login> logins;
...
QSettings settings;
settings.beginWriteArray("logins");
for (int i = 0; i < logins.size(); ++i) {
settings.setArrayIndex(i);
settings.setValue("userName", list.at(i).userName);
settings.setValue("password", list.at(i).password);
}
settings.endArray();
存储格式
logins/size
logins/1/userName
logins/1/password
logins/2/userName
logins/2/password
logins/3/userName
logins/3/password
...
如果存在名为key的设置,则返回true否则返回false。
bool QSettings::contains(const QString &key) const
返回使用此QSettings对象写入的设置的存储路径。
QString QSettings::fileName() const
删除设置键和键的任何子设置。
void QSettings::remove(const QString &key)
例子
QSettings settings;
settings.setValue("ape");
settings.setValue("monkey", 1);
settings.setValue("monkey/sea", 2);
settings.setValue("monkey/doe", 4);
settings.remove("monkey");
QStringList keys = settings.allKeys();
// keys: ["ape"]
请注意,如果其中一个回退位置包含具有相同键的设置,则在调用remove()后该设置将可见。 如果key为空字符串,则删除当前组()中的所有键。例如:
QSettings settings;
settings.setValue("ape");
settings.setValue("monkey", 1);
settings.setValue("monkey/sea", 2);
settings.setValue("monkey/doe", 4);
settings.beginGroup("monkey");
settings.remove("");
settings.endGroup();
QStringList keys = settings.allKeys();
// keys: ["ape"]
注意,Windows注册表和INI文件使用不区分大小写的键,而macOS和iOS上的CFPreferences API使用区分大小写的键。为了避免可移植性问题。
设置访问INI文件的编解码器(包括。Unix上的conf文件)转换为编解码器。编解码器用于对从INI文件读取的任何数据进行解码,并对写入文件的任何数据进行编码。默认情况下,不使用编解码器,非ASCII字符使用标准INI转义序列进行编码。
void QSettings::setIniCodec(QTextCodec *codec)
警告
:在访问任何数据之前,必须在创建QSettings对象之后立即设置编解码器。
设置访问INI文件的编解码器(包括。conf文件)转换为由codecName指定的编码的QTextCodec。codecName的常用值包括“UTF-8”、“ISO 8859-1”和“UTF-16”。如果编码没有被识别,什么都不会发生。
void QSettings::setIniCodec(const char *codecName)
将用于存储给定格式和范围的设置的路径设置为path。该格式可以是自定义格式。
void QSettings::setPath(QSettings::Format format, QSettings::Scope scope, const QString &path)
下表总结了默认值:
将设置键的值设置为value。如果该键已经存在,以前的值将被覆盖。
void QSettings::setValue(const QString &key, const QVariant &value)
注意,Windows注册表和INI文件使用不区分大小写的键,而macOS和iOS上的CFPreferences API使用区分大小写的键。
将任何未保存的更改写入永久存储,并重新加载同时已被另一个应用程序更改的任何设置。 这个函数由QSettings的析构函数自动调用,并由事件循环定期调用,所以通常不需要自己调用。
void QSettings::sync()
返回设置键的值。如果该设置不存在,则返回defaultValue。 如果没有指定默认值,则返回默认的QVariant。
注意,Windows注册表和INI文件使用不区分大小写的键,而macOS和iOS上的CFPreferences API使用区分大小写的键。
QVariant QSettings::value(const QString &key, const QVariant &defaultValue = QVariant()) const
QSettings settings;
settings.setValue("animal/snake", 58);
settings.value("animal/snake", 1024).toInt(); // returns 58
settings.value("animal/zebra", 1024).toInt(); // returns 1024
settings.value("animal/zebra").toInt(); // returns 0
用户通常希望应用程序记住它的设置(窗口大小和位置,选项等)。)跨会话。
这些信息通常存储在Windows的系统注册表中,以及macOS和iOS的属性列表文件中。
在Unix系统上,由于缺乏标准,许多应用程序(包括KDE应用程序)都使用INI文本文件。
QSettings是围绕这些技术的抽象,使您能够以可移植的方式保存和恢复应用程序设置。它还支持自定义存储格式。
QSettings的API基于QVariant,可以让你用最少的努力保存大多数基于值的类型,比如QString、QRect、QImage
。 如果您只需要一个非持久的基于内存的结构,可以考虑使用QMap来代替。
QSettings对象既可以在堆栈上创建,也可以在堆上创建(即使用new)。构造和销毁QSettings对象的速度非常快。