Qt模块化笔记之core——Input/Output文件操作(3)

今天记录下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().)
另一个枚举型(Scope)范围:

Constant Value 描述
QSettings::UserScope 0 存储在当前只对当前用户用户的某地 (e.g., in the user's home directory).
QSettings::SystemScope 1 存储在所有用户都能使用的地方
具体存储位置如下(抄自官网):MySoft即上方的“公司名”,Star Runner”软件名“

On Windows, NativeFormatsettings are stored in the following registry paths(配置存储在以下注册表位置):

  1. HKEY_CURRENT_USER\Software\MySoft\Star Runner
  2. HKEY_CURRENT_USER\Software\MySoft\OrganizationDefaults
  3. HKEY_LOCAL_MACHINE\Software\MySoft\Star Runner
  4. HKEY_LOCAL_MACHINE\Software\MySoft\OrganizationDefaults

On Unix systems, if the file format is NativeFormat, the following files are used by default:

  1. $HOME/.config/MySoft/Star Runner.conf (Qt for Embedded Linux: $HOME/Settings/MySoft/Star Runner.conf)
  2. $HOME/.config/MySoft.conf (Qt for Embedded Linux: $HOME/Settings/MySoft.conf)
  3. /etc/xdg/MySoft/Star Runner.conf
  4. /etc/xdg/MySoft.conf

On Mac OS X versions 10.2 and 10.3, these files are used by default:

  1. $HOME/Library/Preferences/com.MySoft.Star Runner.plist
  2. $HOME/Library/Preferences/com.MySoft.plist
  3. /Library/Preferences/com.MySoft.Star Runner.plist
  4. /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");

    ...
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值