QSettings的基本使用详解(一)
**前两个例子Copy连接:http://blog.youkuaiyun.com/xwdpepsi/article/details/8523080
Qt写ini文件
#include <QtCore/QCoreApplication>
#include <QSettings>
int main(int argc, char argv[])
{
QCoreApplication a(argc, argv);
//Qt中使用QSettings类读写ini文件
//QSettings构造函数的第一个参数是ini文件的路径,第二个参数表示针对ini文件,第三个参数可以缺省
QSettings configIniWrite = new QSettings("hahaya.ini", QSettings::IniFormat);
//向ini文件中写入内容,setValue函数的两个参数是键值对
//向ini文件的第一个节写入内容,ip节下的第一个参数
configIniWrite->setValue("/ip/first", "192.168.0.1");
//向ini文件的第一个节写入内容,ip节下的第二个参数
configIniWrite->setValue("ip/second", "127.0.0.1");
//向ini文件的第二个节写入内容,port节下的第一个参数
configIniWrite->setValue("port/open", "2222");
//写入完成后删除指针
delete configIniWrite;
return a.exec();
}
Qt读ini文件
#include <QtCore/QCoreApplication>
#include <QSettings>
#include <QString>
#include <QDebug>
int main(int argc, char argv[])
{
QCoreApplication a(argc, argv);
QSettings configIniRead = new QSettings("hahaya.ini", QSettings::IniFormat);
//将读取到的ini文件保存在QString中,先取值,然后通过toString()函数转换成QString类型
QString ipResult = configIniRead->value("/ip/second").toString();
QString portResult = configIniRead->value("/port/open").toString();
//打印得到的结果
qDebug() << ipResult;
qDebug() << portResult;
//读入入完成后删除指针
delete configIniRead;
return a.exec();
}
基本使用(PS:后面有些地方是使用组织代替公司的)
创建
QSettings
对象QSetting(“公司名字”,”程序名字”),这决定了你的配置文件所在的路径与名字,公司名字使用公司域名(这在某些平台下是种惯例如IOS);同时它可以创建在堆或栈上,因为它的创建和破坏是十分快的.
存储是一种键值对的方式
settings.setValue("editor/wrapMargin", 68);
如果使用了新值覆盖旧值可能无法立即同步至文件,可调用
sync
()
提交你的修改(同时能更新至正在使用同一个文件的Setting)
双参数,无值则返回默认值
int margin = settings.value("editor/wrapMargin", 80).toInt();
QSettings settings("MySoft", "Star Runner");
QColor color = palette().background().color();
settings.setValue("DataPump/bgcolor", color);
为此我们可以使用它提供的模板方法
QVariant::value
()
去转换
QSettings settings("MySoft", "Star Runner");
QColor color = settings.value("DataPump/bgcolor").value<QColor>();
想存储自定义的类型?去看看这个吧
qRegisterMetaType
() and
qRegisterMetaTypeStreamOperators
()
真
为了可移植,不同平台下规则不同,所以我们要去遵守一些规则(Key在windows大小写不敏感,IOS敏感之类的不同)
1.配置文件中的大小写和代码中大小写同一,不要ini中key为inta,代码中用INTA去读取
2.不要存两个Key然后这两个key只是大小写不同(没人这么变态的吧,有的话,他一定和这个项目有仇)
3.不要使用斜杠在节点或key的名字中,反斜杠(‘/’)会被用于分割,windows的(‘\’)会被QSettings转成(‘/’);
想一次指定多个key具有相同前缀吗?Qt妥妥的为我们提供了
beginGroup
() and
endGroup
()
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();
还有类似”数组”的概念,将配置文件中的数据读出与写入
先看读的吧
struct Login {
QString userName;
QString password;
};//定义结构体
QList<Login> logins;//定义结构体类型的容器
...
QSettings settings;
int size = settings.beginReadArray("logins");//获取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();
写呢(和读差不多诶)
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();
Fallback机制(我也不知道这个要怎么翻译)
作用:当在指定区域中寻找不到这个key时会去其他地方找(总共也就4个地方,寻找地方的多少取决于你初始化的参数)
QSettings obj1("MySoft", "Star Runner");
QSettings obj2("MySoft");
QSettings obj3(QSettings::SystemScope, "MySoft", "Star Runner");
QSettings obj4(QSettings::SystemScope, "MySoft");
Locations (X:首选位置,O:后备搜索位置) | obj1 (包含组织与程序名) | obj2(只有组织) | obj3(限定了系统) | obj4 |
1. User, Application(指定程序位置) | X | |||
2. User, Organization(指定组织下的所有程序位置) | O | X | ||
3. System, Application(系统中指定程序的位置) | O | X | ||
4. System, Organization(系统中指定组织下的所有程序位置) | O | O | O | O |