《Qt5实战》之软件全局配置(单例模式)

1 概述

在大大小小的企业软件中,少不了配置单元,程序启动初始化需要加载配置,用户设置及操作需要保存配置。Qt中可以使用QSetting很方便的实现,并且可以生成.ini配置文件。为降低程序耦合性,这里采用单例模式来实现全局配置。废话不多说,直接上代码。

2 实现

使用时只需将头文件和源文件加入工程,在要用到配置的地方使用appSettingsInstance。

先看配置文件示例databae.ini

[Database]
path=./database
file=system.db
name=evaluatecenter
user=root
passwd=123456

configdef.h可以这样

#ifndef CONFIGDEF_H
#define CONFIGDEF_H

#include <QSettings>

// 配置文件
#define CONFIG_FILE_NAME QString("./config/database.ini")

// Database
#define DATABASE_PATH QString("Database/path")  //数据库存放路径,./为运行程序所在目录
#define DATABASE_FILE QString("Database/file")  //SQLITE数据库文件
#define DATABASE_NAME QString("Database/name")  //数据库名
#define DATABASE_USER QString("Database/user")  //用户名
#define DATABASE_PASSWD QString("Database/passwd")  //密码

#endif // CONFIGDEF_H

2.1 appsettings.h

#ifndef APPSETTINGS_H
#define APPSETTINGS_H

#include "configdef.h"

#define appSettingsInstance AppSettings::getInstance()

class AppSettings
{
public:
    static AppSettings* getInstance()
    {
        if(appSettings == nullptr)
        {
            appSettings = new AppSettings();
            settings = new QSettings(CONFIG_FILE_NAME,QSettings::IniFormat);
        }

        return appSettings;
    }

    static QVariant getSetting(QString key)
    {
        return settings->value(key);
    }

    static void setSetting(QString key, QVariant value)
    {
        return settings->setValue(key,value);
    }

    static void quit();
private:
    AppSettings();//禁止构造函数
    AppSettings(const AppSettings&){}//禁止拷贝构造函数
    AppSettings & operator=(const AppSettings &){}//禁止赋值拷贝构造函数

private:
    static AppSettings *appSettings;
    static QSettings *settings;
};

#endif // APPSETTINGS_H

2.2 appsettings.cpp

这里放在cpp文件里进行初始化是为了防止重复包含头文件导致多重定义错误编译不通过。

#include "appsettings.h"


AppSettings *AppSettings::appSettings = nullptr;
QSettings *AppSettings::settings = nullptr;

void AppSettings::quit()
{
    qInfo("[OK] AppSettings quit.");
}

AppSettings::AppSettings()
{

}

 

;