使用QSettings保存QT应用程序数据
简介
QSettings类提供了持久的跨平台应用程序设置,这些settings一般都是存在系统里的,比如windows一般都写在系统注册表或者写INI文件,mac系统一般都在XML文件里,那么按照一般的标准来说,许多应用程序是用INI文件来实现的。而Qsettings就是提供了一种方便的方法来存储和恢复应用程序的settings。
QSettings的API是基于Qvariant,Qvariant是一种数据类型的集合,它包含了大部分通常的Qt数据类型,比如QString,QRec,QImage,等等。
1.QSettings写ini文件
#include <QSettings>
struct Login {
QString userName;
QString password;
};
void main(int argc, char *argv[])
{
//创建一个ini配置文件
QSettings settings("setting.ini", QSettings::IniFormat);
//清除这个配置文件
settings.clear();
settings.beginGroup("MAIN FILE INFO");
//调用setValue中键名按字面解析
settings.setValue("MAIN/FILE/INFO/exeTitle", "Test");
settings.setValue("curDir", "D:");
settings.endGroup();
//没有beginGroup 第一个'/'前的字符会当节名创建节
settings.setValue("MAIN/FILE/INFO/exeTitle", "Test");
//没有节名的数据会创建一个[General]
settings.setValue("curDir", "D:");
//相同节名的数据会放到一起
settings.setValue("MAIN/curDir", "D:");
QList<Login> logins;
Login login1 = { "inno", "123456" };
Login login2 = { "gyj", "123456" };
logins << login1 << login2;
settings.beginWriteArray("logins");
for (int i = 0; i < logins.size(); ++i) {
settings.setArrayIndex(i);
settings.setValue("userName", logins.at(i).userName);
settings.setValue("password", logins.at(i).password);
}
settings.endArray();
settings.sync();
}
setting.ini文件内容为
[MAIN%20FILE%20INFO]
MAIN\FILE\INFO\exeTitle=Test
curDir=D:
[MAIN]
FILE\INFO\exeTitle=Test
curDir=D:
[General]
curDir=D:
[logins]
1\userName=inno
1\password=123456
2\userName=gyj
2\password=123456
size=2
2.QSettings读ini文件
#include <QSettings>
#include <QDebug>
struct Login {
QString userName;
QString password;
};
void main(int argc, char *argv[])
{
QSettings settings("setting.ini", QSettings::IniFormat);
settings.beginGroup("MAIN FILE INFO");
qDebug() << settings.value("MAIN/FILE/INFO/exeTitle").toString();
settings.endGroup();
qDebug() << settings.value("MAIN/FILE/INFO/exeTitle").toString();
qDebug() << settings.value("curDir").toString();
int size = settings.beginReadArray("logins");
for (int i = 0; i < size; ++i) {
settings.setArrayIndex(i);
qDebug() << settings.value("userName").toString();
qDebug() << settings.value("password").toString();
}
settings.endArray();
}
输出为:
"Test"
"Test"
"D:"
"inno"
"123456"
"gyj"
"123456"
3.QSettings读写自定义数据结构数据
上面我们用了两个键值对来保存一个Login结构体数据,这样操作保存和赋值都比较麻烦。我们可以通过给找个结构体增加一对QDataStream& operator>>和QDataStream& operator<<来实现自定义数据的保存与读取。
#include <QSettings>
#include <QDebug>
#include <QDataStream>
struct Login {
QString userName;
QString password;
};
QDataStream& operator<<(QDataStream& out, const Login& obj)
{
out << obj.userName << obj.password;
return out;
}
QDataStream& operator>>(QDataStream& in, Login &obj)
{
in >> obj.userName >> obj.password;
return in;
}
//Q_DECLARE_METATYPE
//如果要使自定义类型或其他非QMetaType内置类型在QVaiant中使用,必须使用该宏。
//该类型必须有公有的 构造、析构、复制构造 函数
Q_DECLARE_METATYPE(Login)
void main(int argc, char *argv[])
{
//注册Login让QSettings使用
qRegisterMetaTypeStreamOperators<Login>("Login");
QSettings settings("setting.ini", QSettings::IniFormat);
settings.clear();
Login login = {"inno", "123456" };
settings.setValue("login", QVariant::fromValue(login));
settings.sync();
}
读取和普通读取属性是一样的