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