转载自:http://blog.csdn.net/u011512437/article/details/43927321
当应用中有设置偏好时,必然的就需要保存用户的设置(总不能让用户每次打开软件都去设置一遍吧。。。)。要想保存用户设置,QT提供了QSetting类,可以轻松的完成,而且还能跨应用访问,其实QSetting不只是能保存用户设置,不管什么变量都可以保存,包括用户登录状态等,虽然这可能不是最好的选择!使用QSetting时,会涉及到QVariant类的部分内容,下面来看看如何使用它们。
QSetting
初始化
QSettings settings("Company", "App");
如果在应用多个地方使用QSetting,应该这样设置:
QCoreApplication::setOrganizationName("Company");
QCoreApplication::setOrganizationDomain("Company.com");
QCoreApplication::setApplicationName("App");
...
QSettings settings;
在OS X中,使用Domains取代Name来识别软件(如果不设置Domain,程序将根据Name推断Domain)
存储
void QSettings::setValue(const QString & key, const QVariant & value)
注意:修改原有设置不能立即生效,可使用sync()提交更改
读取
QVariant QSettings::value(const QString & key, const QVariant & defaultValue = QVariant()) const
当key不存在,返回NULL(defaultValue未设置时)或返回defaultValue。
存在性检测与删除
检测某个key存在性:
bool QSettings::contains(const QString & key) const
删除某个key:
void QSettings::remove(const QString & key)
查看所有key值:
QStringList QSettings::allKeys() const
删除所有key:
void QSettings::clear()
前缀
void QSettings::beginGroup(const QString & prefix)
void QSettings::endGroup()
可在beginGroup()与endGroup()之间使用多个setValue()。
QSetting同样支持array概念:
int QSettings::beginReadArray(const QString & prefix)
void QSettings::beginWriteArray(const QString & prefix, int size = -1)
Fallback机制
key值查找顺序(假设公司为MySoft,应用为Star Runner):
1. a user-specific location for the Star Runner application
2. a user-specific location for all applications by MySoft
3. a system-wide location for the Star Runner application
4. a system-wide location for all applications by MySoft
设置QSetting对象:
QSettings
(
Format format, Scope scope, const QString & organization,
const QString & application = QString(), QObject * parent = 0
)
Scope: QSettings::SystemScope、QSettings::UserScope
Format: QSettings::IniFormat、QSettings::NativeFormat
储存和恢复GUI程序
void MainWindow::writeSettings()
{
QSettings settings("Moose Soft", "Clipper");
settings.beginGroup("MainWindow");
settings.setValue("size", size());
settings.setValue("pos", pos());
settings.endGroup();
}
void MainWindow::readSettings()
{
QSettings settings("Moose Soft", "Clipper");
settings.beginGroup("MainWindow");
resize(settings.value("size", QSize(400, 400)).toSize());
move(settings.value("pos", QPoint(200, 200)).toPoint());
settings.endGroup();
}
MainWindow::MainWindow()
{
...
readSettings();
}
void MainWindow::closeEvent(QCloseEvent *event)
{
if (userReallyWantsToQuit()) {
writeSettings();
event->accept();
}
else
{
event->ignore();
}
}
QVariant
转型
QVariant未提供由QVariant类型转换为QColor、QImage、QPixmap类型(但后者可转换为前者类型),但可以使用下面的Template函数来实现转型
T QVariant::value() const
T qVariantValue(const QVariant & value)
注册用户类型
int qRegisterMetaType(const char * typeName)
void qRegisterMetaTypeStreamOperators(const char * typeName)