Qt配置文件读写类

vanxkr_config.h

#ifndef LINKJOIN_CONFIG_H
#define LINKJOIN_CONFIG_H

#pragma execution_character_set("utf-8") // 编译时把程序里的字符串使用 UTF-8 进行处理

#include <QApplication>
#include <QSettings>
#include <QVariant>
#include <QMutex>

class Config {
public:
    inline static Config *Config::getInstance() {
        if (Q_NULLPTR == instance) {
            QMutexLocker lock(&mutex);
            if (Q_NULLPTR == instance) {
                Config *instance_ = new Config();
                instance = instance_;
            }
        }
        return instance;
    }

    void setPathFile(const QString &path_file); // 重设config.ini文件路径
    bool iniContains(const QString &key);   // 检测配置存在
    QVariant iniRead(const QString &key, const QVariant &defaultValue = QVariant());
    void iniWrite(const QString &key, const QVariant &value);   // 写配置文件

private:
    Config();
    ~Config();
    static Config *instance;
    static QMutex mutex;
    class GC {  // GC 机制 自动回收
    public:
        ~GC() { // 可以在这里销毁所有的资源
            if (Q_NULLPTR != instance) {
                delete instance;
                instance = Q_NULLPTR;
            }
        }
        static GC gc;  // 用于释放单例
    };

    QString     pathFile;   // ini文件路径
    QSettings   *settings;

    void destroy(); // 释放资源
};

#endif  // LINKJOIN_CONFIG_H

vanxkr_config.cpp

#pragma execution_character_set("utf-8") // 编译时把程序里的字符串使用 UTF-8 进行处理

#include <QDebug>

#include "config.h"

Config *Config::instance = Q_NULLPTR;
QMutex Config::mutex;

void Config::setPathFile(const QString & pathFile) {
    if (pathFile != this->pathFile) {
        this->pathFile = pathFile;
        settings->sync();   // 及时同步之前的
        settings->setPath(settings->format(), settings->scope(), pathFile); // 改变路径
        settings->setIniCodec("UTF-8");
    }
}

bool Config::iniContains(const QString &key) {
    return settings->contains(key);
}

QVariant Config::iniRead(const QString &key, const QVariant &defaultValue/* = QVariant()*/) {
    if (!settings->contains(key)) { // 不存在
        settings->setValue(key, defaultValue);  // 使用默认值创建
        return defaultValue;    // 返回默认值
    }
    return settings->value(key);
}

void Config::iniWrite(const QString &key, const QVariant &value) {
    settings->setValue(key, value);
}

Config::Config()
    : pathFile("config.ini")
    , settings(new QSettings(pathFile, QSettings::IniFormat)) {
    settings->setIniCodec("UTF-8");
}

Config::~Config() {
    destroy();  // 销毁
}

void Config::destroy() {
    if (Q_NULLPTR != settings) {
        settings->sync();   // 销毁前同步
        settings->deleteLater();
        settings = Q_NULLPTR;   // 置空
    }
}

测试

#pragma execution_character_set("utf-8")    // utf-8

#include <QTextCodec>

#include "vanxkr_config.h"

Config::GC Config::GC::gc;  // GC机制 单例自动析构

QTextCodec::setCodecForLocale(QTextCodec::codecForName("UTF-8"));   // 使用 UTF-8 的运行时环境
QDir::setCurrent(QCoreApplication::applicationDirPath());           // 设置当前目录为 app 所在目录

Config *config = Config::getInstance();

config->iniContains(QStringLiteral("Test/test0"));  // return: false
config->iniRead(QStringLiteral("Test/test0"), 0);   // ini: [Test]\ntest0=0 return QVariant(0);
config->iniContains(QStringLiteral("Test/test0"));  // return: true
config->iniWrite(QStringLiteral("Test/test0"), 1);  // ini: [Test]\ntest0=1
config->iniRead(QStringLiteral("Test/test0"), 0);   // return QVariant(1);

config->iniWrite(QStringLiteral("Test/test1"), 0);  // ini: [Test]\ntest1=0
config->iniRead(QStringLiteral("Test/test1"), 0);   // return QVariant(0);

本文作者:vanxkr

本文链接:http://www.vanxkr.com/2019/11/Qt-config

版权声明:本博客所有文章除特别声明外,均采用CC BY-NC-SA 3.0许可协议。转载请注明出处!

Qt记住上次窗口的位置和状态
0 条评论
已登录,注销 取消