使用QSettings保存QT应用程序数据

6 篇文章 0 订阅
4 篇文章 0 订阅

使用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();
}

读取和普通读取属性是一样的

  • 5
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值