Qt 保存配置文件

Qt-Widget中的基本实现

下面的案例展示了

  • QSettings对象的创建
  • QString字符串类型的数据保存
  • QList对象列表类型的数据保存
//头文件引入
#include <QSettings>

typedef struct {
  int age;
  QString name;
  QString area;
} Person;


//全局QSettings对象
QSettings* mSettings=NULL ;



MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    this->setCentralWidget(ui->textEdit);
    
    
    if(mSettings==NULL){
        //创建QSettings对象 //文件名settings.ini
        mSettings = new QSettings("settings.ini",QSettings::IniFormat);
    }
    
    //-------------获取Settings字符串类型(QString)的数据信息----------------//
    
    //获取字符串类型
    QString value =mSettings->value("namelist/name").toString()

    //-------------获取Settings对象数组类数据(QList<T *>)信息----------------//

    //获取对象数组类数据 
    //开始读
    int size = mSettings->beginReadArray("persons");
    QList<Person> lists;
    Person person;
    for(int i = 0;i<size;++i){
        //设置index
        mSettings->setArrayIndex(i);
        person.age = mSettings->value("age").toInt();
        person.name = mSettings->value("name").toString();
        person.area = mSettings->value("area").toString();
        lists.append(person);
    }
    //关闭读
    mSettings->endArray();

    //-------------保存Settings信息字符串类型(QString)的数据信息----------------//

    //保存字符串类型
    mSettings->value("namelist/name","李四") 

    //-------------保存Settings对象数组类数据(QList<T *>)信息----------------//

    //保存对象数组类数据 
    //开始读
    mSettings->beginWriteArray("persons");
    for(int i = 0;i<lists.length();++i){
        mSettings->setArrayIndex(i);
        qDebug()<<lists[i];
        mSettings->setValue("age",lists[i].age);
        mSettings->setValue("name",lists[i].name);
        mSettings->setValue("area",lists[i].area);
    }
    //关闭读
    mSettings->endArray();
}
c++

Qt-Quick中的基本实现

基本结构是一样的,不同的是在Qt Quick里面,需要用到C++与qml的信息传递

  • 头文件settingsutils.h
#ifndef SETTINGSUTILS_H
#define SETTINGSUTILS_H

#include <QObject>
#include "QSettings"

typedef struct {
    QString id;
    QString name;
    QString artist;
    QString url;
    QString type;
} MusicData;

class SettingsUtils : public QObject
{
    Q_OBJECT
public:
    explicit SettingsUtils(QObject *parent = nullptr);
    ~SettingsUtils();

    Q_INVOKABLE void save(QString key,QString value);
    Q_INVOKABLE QString getString(QString key);
    Q_INVOKABLE QList<MusicData> get(QString key);


private:
    QSettings *settings;
signals:
};

#endif // SETTINGSUTILS_H
c++
  • settingsutils.cpp
#include "settingsutils.h"
#include "QSettings"
#include "QJsonObject"
#include "QJsonDocument"
#include <QDebug>

SettingsUtils::SettingsUtils(QObject *parent) : QObject(parent)
{
    settings=new QSettings("settings.ini",QSettings::IniFormat);
    settings->setIniCodec("utf-8");
}

//由于c++与qml通信过程中,复杂数据无法传输,所以一律转为QString字符串类型进行传递
//因此下面用到了字符串转json对象的实现,
void SettingsUtils::save(QString key,QString value){
    //字符串转json对象
    QJsonDocument jsonDocument = QJsonDocument::fromJson(value.toStdString().data());
    if(jsonDocument.isNull())
    {
        qDebug()<< "String NULL"<< value.toLocal8Bit().data();
        return;
    }

    QJsonObject jsonObject = jsonDocument.object();

    MusicData  musicData;
    musicData.id=jsonObject["id"].toString();
    musicData.name=jsonObject["name"].toString();
    musicData.artist=jsonObject["artist"].toString();
    musicData.url=jsonObject["url"].toString();
    musicData.type=jsonObject["type"].toString();

    //获取记录

    QList<MusicData> lists = get(key);
    //去重历史记录
    for(int index = 0 ;index<lists.length();index++){
        if(lists[index].id==musicData.id){
            lists.removeAt(index);
            break;
        }
    }
    //添加数据
    lists.insert(0,musicData);

    //开启settings写数组,传入key
    settings->beginWriteArray(key);

    for(int i = 0;i<lists.length();++i){
        settings->setArrayIndex(i);
        settings->setValue("id",lists[i].id);
        settings->setValue("name",lists[i].name);
        settings->setValue("url",lists[i].url);
        settings->setValue("type",lists[i].type);
    }
    settings->endArray();
}

QList<MusicData> SettingsUtils::get(QString key){
    int size = settings->beginReadArray(key);
    QList<MusicData> lists;
    MusicData musicData;
    for(int i = 0;i<size;++i){
        settings->setArrayIndex(i);
        musicData.id=settings->value("id").toString();
        musicData.name=settings->value("name").toString();
        musicData.artist=settings->value("artist").toString();
        musicData.url=settings->value("url").toString();
        musicData.type=settings->value("type").toString();
        lists.append(musicData);
    }
    settings->endArray();
    return lists;
}
SettingsUtils::~SettingsUtils(){
    delete settings;
}

c++
  • 在main函数中注册
#include "settingsutils.h"

int main(int argc, char *argv[])
{
    //参数:qmlRegisterType<C++类型名> (命名空间 主版本 次版本 QML中的类型名)
    qmlRegisterType<SettingsUtils>("MyUtils",1,0,"SettingsUtils");
}

c++
  • qml调用
//引入命名空间 版本
import MyUtils 1.0

ApplicationWindow {

  //注册组件
  SettingsUtils{
      id:settings
  }

  Button{
    text:"保存"
    onClicked: {
     var data = {
            id:"124",
            name:"你好",
            url:"http://1231245646.mp3",
            type:"0"
        }
        settings.save("key",JSON.stringify(data))
    }
  } 

  Button{
    text:"获取"
    onClicked: {
        settings.get("key")
    }
  } 

}

qml
打赏
  • 微信
  • 支付宝
评论
来发评论吧~
···

歌手: