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);