今天记录下QSettings(配置类)的使用。
QSettings 在windows中用于操作注册表,保存程序的配置,诸如窗口大小、位置及颜色等。
注册表(引自点击打开链接): 注册表好比是我们用的户口簿,我们安装的程序都要在注册表中进行注册登记。注册表中可以记录程序或文件存放的位置、授权信息、外观设置……
人们通过修改注册表相应的键值,可以获得他们想要的效果而省去了复杂的操作。
基本使用方法:
该类比较常用的有几个构造函数及公共函数:
QSettings(const QString & organization, const QString & application = QString(), QObject * parent = 0)
QSettings(Scope scope, const QString & organization, const QString & application = QString(), QObject * parent = 0)
QSettings(Format format, Scope scope, const QString & organization, const QString & application = QString(), QObject * parent = 0)
QSettings(const QString & fileName, Format format, QObject * parent = 0)
QSettings(QObject * parent = 0)
void setValue(const QString & key, const QVariant & value)
QVariant value(const QString & key, const QVariant & defaultValue = QVariant()) const
void sync()
构造函数中有organization(组织,一般公司名), application (一般软件名),Format (存储格式,可存于注册表或ini文件中,可选,需存在),Scope (范围,只有当前用户可用或可用于所有用户)。
setValue()设置值
Value()用于取回值
sync(),同步,有提交的意思,只有运行该函数后,才写入。
示例如下:
#include "dialog.h"
#include "ui_dialog.h"
#include <QSettings>
#include <QDebug>
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::on_pushButton_clicked()
{
QSettings settings("测试软件名", "无公司名");
settings.setValue("app/width", this->width());//保存窗口宽
settings.setValue("app/height", this->height());
settings.sync();
}
void Dialog::on_pushButton_2_clicked()
{
QSettings settings("测试软件名", "无公司名");
int width=settings.value("app/width", 100).toInt();//数字100是假如未能取到该设置值,则默认为100
int height=settings.value("app/height", 100).toInt();
this->resize(width,height);
}
按钮1点击后保存程序的长与宽,手动将窗口的长或宽拉长或缩小后,点按钮2可将它还原为刚保存的长宽。
由于我在windows7上测试,效果如下:
打开注册表(开始-运行-输入regedit)-跳出注册表编辑器,在“HKEY_CURRENT_USER\Software”可看到
对于存储一些比较特别的数据类型的,如 QColor, QImage, 和QPixmap,由于没有toColor(), toImage(), o或toPixmap()等,可用 QVariant::value() 或qVariantValue() 函数
如(引自官网):
QSettings settings("MySoft", "Star Runner");
QColor color = settings.value("DataPump/bgcolor").value<QColor>();
存储时类似:
QSettings settings("MySoft", "Star Runner");
QColor color = palette().background().color();
settings.setValue("DataPump/bgcolor", color);
对于想要删除配置信息,可用:
void remove(const QString & key)
void clear()
可用setPath()改变存储的位置
void QSettings::setPath(Format format, Scope scope, const QString & path) [static]
(改变第三个参数),如不指定第三个参数,它们的默认位置见
点击打开链接
组(group)概念的使用:
void beginGroup(const QString & prefix)
void endGroup()
QString group() const
如程序的窗口,不仅有位置x`y也有长和宽,这时,可以将它分组在一起mainwindow
示例(来自官网):
基本使用方法:
settings.setValue("mainwindow/size", win->size());
settings.setValue("mainwindow/fullScreen", win->isFullScreen());
settings.setValue("outputpanel/visible", panel->isVisible());
使用组的概念后:
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();
数组("array" )概念的使用:
void beginWriteArray(const QString & prefix, int size = -1)用于写入配置
int beginReadArray(const QString & prefix)用于读取配置
void endArray()结束
void setArrayIndex(int i)设索引
代码如下(写入配置)(来自官网,略有修改,未测试):
struct Login {
QString userName;
QString password;
};
QList<Login> logins;
Login login1;
Login login2;
login1.userName=uN1;
login1.password=p1;
login2.userName=uN2;
login2.password=p2;
QSettings settings;
logins<<login1<<login2;
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/1/userName
logins/1/password
logins/2/userName
logins/2/password
需要读取出来时(读取配置):
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();
平台(操作系统)相关:
在那些构造数中,有个枚举型的参数(Format)格式,有如下值:
常量 | 值 | 描述 |
---|---|---|
QSettings::NativeFormat(默认) | 0 | 使用系统默认(win下注册表,linux下*.ini文件) |
QSettings::IniFormat | 1 | 使用ini文件存 |
QSettings::InvalidFormat | 16 | 自定义的格式(registerFormat().) |
Constant | Value | 描述 |
---|---|---|
QSettings::UserScope | 0 | 存储在当前只对当前用户用户的某地 (e.g., in the user's home directory). |
QSettings::SystemScope | 1 | 存储在所有用户都能使用的地方 |
On Windows, NativeFormatsettings are stored in the following registry paths(配置存储在以下注册表位置):
- HKEY_CURRENT_USER\Software\MySoft\Star Runner
- HKEY_CURRENT_USER\Software\MySoft\OrganizationDefaults
- HKEY_LOCAL_MACHINE\Software\MySoft\Star Runner
- HKEY_LOCAL_MACHINE\Software\MySoft\OrganizationDefaults
On Unix systems, if the file format is NativeFormat, the following files are used by default:
- $HOME/.config/MySoft/Star Runner.conf (Qt for Embedded Linux: $HOME/Settings/MySoft/Star Runner.conf)
- $HOME/.config/MySoft.conf (Qt for Embedded Linux: $HOME/Settings/MySoft.conf)
- /etc/xdg/MySoft/Star Runner.conf
- /etc/xdg/MySoft.conf
On Mac OS X versions 10.2 and 10.3, these files are used by default:
- $HOME/Library/Preferences/com.MySoft.Star Runner.plist
- $HOME/Library/Preferences/com.MySoft.plist
- /Library/Preferences/com.MySoft.Star Runner.plist
- /Library/Preferences/com.MySoft.plist
注册一个自定义格式:
Format QSettings::registerFormat(const QString & extension, ReadFunc readFunc, WriteFunc writeFunc, Qt::CaseSensitivity caseSensitivity = Qt::CaseSensitive) [static]
bool readXmlFile(QIODevice &device, QSettings::SettingsMap &map);
bool writeXmlFile(QIODevice &device, const QSettings::SettingsMap &map);
int main(int argc, char *argv[])
{
const QSettings::Format XmlFormat =
QSettings::registerFormat("xml", readXmlFile, writeXmlFile);
QSettings settings(XmlFormat, QSettings::UserScope, "MySoft",
"Star Runner");
...
}