保存应用程序设置(QSettings)

1.QSettings类

QSettings提供保存应用程序当前设置的接口,可以方便地保存程序的状态,例如窗口大小和位置,选项的选中状态等等。

在Windows系统中,程序程序的状态信息记录在注册表中;在MacOSX系统上,这些信息记录在XML配置文件中;在Unix系统中,则使用INItext文件记录。QSettings则是对这些技术的一个抽象,使得保存和取得应用程序的设置状态的只得独立于操作系统。

QSettings的API是基于QVariant类,当创建一个QSettings对象时,必须传递公司或组织的名称(QString)和应用程序的名称(QString)用于构造一个QSettings对象。

2.使用QSettings

(1)构造一个QSettings对象

QSettingssettings("MySoft","StarRunner");

(2)添加一个设置到settings中

程序的设置是以“key-value”的形式,保存在QSettings对象中的。其中,key由一个QString类型定义,value是由QVariant类型定义:

settings.setValue("editor/wrapMargin",68);

/*wrapMargin是一个子key

/*如果存在相同的key,那么已存在的key所对应的值将由新值代替

(3)从setttings中取出设置

同时也可以通过key从settings中取出值:

intmargin=settings.value("editor/wrapMargin").toInt();

3.QSettings的组织方式

(1)用“/”表示子key

QSettings存储状态信息的形式是key-value,其中key与文件路径这个概念是类似的,subkey可以用定义文件路径的形式定义,例如findDialog/matchCase,其中matchCase就是一个subkey;

(2)使用beginGroup()和endGroup()

voidQSettings::beginGroup(constQString&prefix)的作用是在当前的group后面加上prefix。当前的group自动加到一个QSettings对象的尾部:

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();

这样设置后,当前的settings对象看上去应该是这样的层次结构:

mainwindow/size

mainwindow/fullScreen

outputpanel/visible

(3)取得key与子key

QStringListQSettings::childKeys()const函数返回所有顶层keys,组成一个QStringList作为一个返回值。例如:

QSettingssettings;

settings.setValue("fridge/color",Qt::white);

settings.setValue("fridge/size",QSize(32,96));

settings.setValue("sofa",true);

settings.setValue("tv",false);

QStringListkeys=settings.childKeys();

那么这个keys中看上去应该是这样的:

keys:["sofa","tv"]

QStringListQSettings::childGroups()const是返回所有包含有key的顶层groups,组成一个QStringList作为返回值:

QSettingssettings;

settings.setValue("fridge/color",Qt::white);

settings.setValue("fridge/size",QSize(32,96));

settings.setValue("sofa",true);

settings.setValue("tv",false);

QStringListgroups=settings.childGroups();

则groups看上去是:

groups:["fridge"]

4.保存和取得程序的设置

(1)在主窗口的构造函数中,readSettings()

voidMainWindow::readSettings()
{
QSettingssettings("SoftwareInc.","Spreadsheet");//写入与读取的settings要一致

restoreGeometry(settings.value("geometry").toByteArray());

recentFiles=settings.value("recentFiles").toStringList();
updateRecentFileActions();

boolshowGrid=settings.value("showGrid",true).toBool();
showGridAction->setChecked(showGrid);

boolautoRecalc=settings.value("autoRecalc",true).toBool();
autoRecalcAction->setChecked(autoRecalc);
}

(2)在关闭主窗口时,writeSettings()

voidMainWindow::writeSettings()
{
QSettingssettings("SoftwareInc.","Spreadsheet");

settings.setValue("geometry",saveGeometry());
settings.setValue("recentFiles",recentFiles);
settings.setValue("showGrid",showGridAction->isChecked());
settings.setValue("autoRecalc",autoRecalcAction->isChecked());
}

/*这