配置数据的3种存储方式:QSettings 、QSQLite 、QJSON

1. QT配置数据的管理和存储方式

1.1 概述

在Qt中,你可以使用多种方式来保存和管理配置数据。

配置数据的用途:

(1)应用程序重启后配置数据的保存

(2)不用应用程序之间交换配置数据

(3)应用程序内部不同对象之间交换配置数据

以下是几种常见的方法:1、QSettings 、2、QSQLite 、3、QJSON

1、QSettings 类

QSettings 类QSettings 是一个方便的方式,用于读取和写入应用程序的配置数据。它可以将配置数据保存在操作系统的注册表(Windows)、配置文件(Unix-like),或者内存中。这是一个跨平台的解决方案,可以方便地保存和检索应用程序的配置设置。

// 写入配置数据
QSettings settings("MyCompany", "MyApp");
settings.setValue("url", "https://www.example.com");
settings.setValue("theme", "dark");
 
// 读取配置数据
QString url = settings.value("url").toString();
QString theme = settings.value("theme").toString();

 

QSettings 是一个方便的类,用于在Qt应用程序中读取和写入配置数据。它可以将配置数据保存在操作系统的注册表(Windows)、配置文件(Unix-like),或者内存中。

QSettings 提供了一种简单的键值对存储方式来管理配置数据,支持多种数据类型。

下面是一些常用的 QSettings 操作: 

写入配置数据:

// 创建 QSettings 对象
QSettings settings("MyCompany", "MyApp");
 
// 写入配置值
settings.setValue("username", "John");
settings.setValue("password", "123456");
 
// 也可以使用 insert() 方法写入多个项
QVariantMap config;
config.insert("url", "https://www.example.com");
config.insert("theme", "dark");
settings.insert("config", config);

读取配置数据:

// 创建 QSettings 对象
QSettings settings("MyCompany", "MyApp");
 
// 读取配置值
QString username = settings.value("username").toString();
QString password = settings.value("password").toString();
 
// 获取包含多个项的配置
QVariantMap config = settings.value("config").toMap();
QString url = config["url"].toString();
QString theme = config["theme"].toString();

删除配置项:

// 创建 QSettings 对象
QSettings settings("MyCompany", "MyApp");
 
// 删除配置项
settings.remove("username");
settings.remove("config");

使用 QSettings 时,应该尽可能指定一个明确的组织名称和应用程序名称,这将有助于避免与其他应用程序的配置项冲突。

默认情况下,QSettings 将配置数据保存在不同操作系统中的不同位置,如 Windows 的注册表、Unix-like 的配置文件。但也可以通过指定特定的文件路径来保存配置数据:

QSettings settings("/path/to/config.ini", QSettings::IniFormat);


总的来说,QSettings 提供了一种简单且跨平台的方式来读取和写入应用程序的配置数据。

你可以根据实际需求选择合适的存储位置,并使用相关的方法来操作配置数据。

2、JSON 文件

JSON 文件:你可以使用Qt的 JSON 类和 QJsonDocument 类来读取和写入 JSON 格式的配置文件。这种方法适用于有结构化数据的配置。

// 写入配置数据
QJsonObject config;
 
config["url"] = "https://www.example.com";
config["theme"] = "dark";
 
QJsonDocument doc(config);
 
QFile file("config.json");
if (file.open(QIODevice::WriteOnly)) {
    file.write(doc.toJson());
    file.close();
}
 
// 读取配置数据
QFile file("config.json");
if (file.open(QIODevice::ReadOnly)) {
    QByteArray data = file.readAll();
    file.close();
 
    QJsonDocument doc = QJsonDocument::fromJson(data);
    QJsonObject config = doc.object();
 
    QString url = config["url"].toString();
    QString theme = config["theme"].toString();
}

注:

以前更多使用 Qt5 专门的 QJsonDocument 及其相关类来读写 JSON 文档,但用久了发现比较麻烦,不够简洁美观,所以更换使用 nlohmann。

nlohmann 是一个用于解析 JSON 的开源 C++ 库,口碑一流,使用非常方便直观,是很多 C++ 程序员的首选。

引用:

#include "nlohmann/json.hpp"
 
using json = nlohmann::json;

如果你想要创建一个如下这样形式的 JSON 对象:

{
  "pi": 3.141,
  "happy": true,
  "name": "Niels",
  "nothing": null,
  "answer": {
    	"everything": 42
  },
  "list": [1, 0, 2],
  "object": {
	    "currency": "USD",
 	    "value": 42.99
  }
}

使用 nlohmann 库可以非常方便的完成:

json j; // 首先创建一个空的json对象
j["pi"] = 3.141;
j["happy"] = true;
j["name"] = "Niels";
j["nothing"] = nullptr;
j["answer"]["everything"] = 42; // 初始化answer对象
j["list"] = { 1, 0, 2 }; // 使用列表初始化的方法对"list"数组初始化
j["object"] = { {"currency", "USD"}, {"value", 42.99} }; // 初始化object对象

3、SQLite 数据库

SQLite 数据库:如果你的配置数据比较复杂或需要进行复杂的查询和操作,你可以使用 SQLite 数据库来保存和管理配置数据。

// 创建数据库连接
QSqlDatabase db = QSqlDatabase::addDatabase("QSQLITE");
db.setDatabaseName("config.db");
 
// 创建配置表
QSqlQuery query;
query.exec("CREATE TABLE config (key TEXT, value TEXT)");
 
// 写入配置数据
query.prepare("INSERT INTO config (key, value) VALUES (:key, :value)");
query.bindValue(":key", "url");
query.bindValue(":value", "https://www.example.com");
query.exec();
 
// 读取配置数据
query.prepare("SELECT value FROM config WHERE key=:key");
query.bindValue(":key", "url");
query.exec();
 
if (query.next()) {
    QString url = query.value(0).toString();
}
 
// 关闭数据库连接
db.close();

1.2 如何通知配置数据的变化

在 QT 中,可以使用信号(Signal)和槽(Slot)机制来通知配置信息的变化。

通过这种方式,当配置信息发生变化时,可以触发相应的信号,然后其他对象可以连接到这些信号并执行相应的操作。

以下是一个供参考的示例代码:

// ConfigManager.h
 
#include <QObject>
#include <QString>
 
class ConfigManager : public QObject
{
    Q_OBJECT
    
public:
    explicit ConfigManager(QObject *parent = nullptr);
    ~ConfigManager();
    
    void setConfigValue(const QString &key, const QString &value);
    
private:
    // 保存配置信息的私有变量
    
signals:
    void configValueChanged(const QString &key, const QString &value);
};

// ConfigManager.cpp
 
#include "ConfigManager.h"
 
ConfigManager::ConfigManager(QObject *parent) : QObject(parent)
{
    // 初始化配置信息
}
 
ConfigManager::~ConfigManager()
{
    // 清理资源
}
 
void ConfigManager::setConfigValue(const QString &key, const QString &value)
{
    // 设置配置信息的值
    // ...
    
    // 发出配置信息变化的信号
    emit configValueChanged(key, value);
}

在上面的示例中,ConfigManager 类继承自 QObject,并声明了一个 configValueChanged 信号,用于通知配置信息的变化。setConfigValue 方法用于设置配置信息的新值,并在值发生变化时发出相应的信号。

在其他类中,可以连接到 configValueChanged 信号并执行相应的槽函数,以响应配置信息的变化。示例代码如下:

// SomeClass.h
 
#include <QObject>
 
class SomeClass : public QObject
{
    Q_OBJECT
    
public:
    explicit SomeClass(QObject *parent = nullptr);
    
public slots:
    void onConfigValueChanged(const QString &key, const QString &value);
};

// SomeClass.cpp
 
#include "SomeClass.h"
 
SomeClass::SomeClass(QObject *parent) : QObject(parent)
{
    // 连接到 configValueChanged 信号
    connect(someConfigManagerInstance, &ConfigManager::configValueChanged,
            this, &SomeClass::onConfigValueChanged);
}
 
void SomeClass::onConfigValueChanged(const QString &key, const QString &value)
{
    // 处理配置信息的变化
    // ...
}

在上述示例中,SomeClass 类连接到了 configValueChanged 信号,并将其与 onConfigValueChanged 槽函数关联起来。当配置信息发生变化并触发信号时,onConfigValueChanged 将被调用以执行相应的处理逻辑。

通过这种方式,可以实现配置信息的变化通知和处理,并在需要的情况下执行相应的操作以适应新的配置。


 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

高亚奇

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值