|
原创来自 一位大侠
http://www.qtcn.org/bbs/read-htm-tid-88919.html
INI 原本是 windows 下 的配置文件。 如果 Qt在 Windows 下使用 需要使用 Windows 家族的头文件,
这样 不能跨平台使用。 幸好一位 大侠 给出一个 简便 的方案 !
亲试好用!
使用方式如下:
1、定义 INI 配置文件方式
// datIni.h 文件
#include "inier.h" // 本文将要实现的
// 加载定义 INI 文件开始
INI_BEGIN("./dat.ini") // 操作的文件路径
// user 段
INI_PARAM(user, QString, Name, "Ann") // 依次是:段名,数据类型,数据名称,默认值
INI_PARAM(user, QString, Power, "123456")
INI_PARAM(user, int, Authority, 1)
// test 段
INI_PARAM(test, int, Num, 15)
INI_PARAM(test, double, Tem, 86.3)
INI_PARAM(test, bool, IsOk, true)
... // 添加各种需要的数据
// 加载定义 INI 文件结束
INI_END
2、使用方式如下
#include <QApplication>
#include "logger.h"
#include "datIni.h" // 上面定义的头文件
int main(int argc, char **argv)
{
QApplication app(argc, argv);
// get 对应的参数,并打印
logDebug(ini.getName(), ini.getPower(), ini.getAuthority(), ini.getNum(), ini.getTem(), ini.getIsOk());
// set 参数
ini.setName("Judi");
ini.setPower("admin");
ini.setTem(63.5);
ini.setIsOk(false);
// get 对应的参数,并打印
logDebug(ini.getName(), ini.getPower(), ini.getAuthority(), ini.getNum(), ini.getTem(), ini.getIsOk());
return 0;
}
3、头文件"inier.h"实现如下
#ifndef INIER_H
#define INIER_H
#include <QSettings>
#include <QString>
// 单实例类宏实现方式
#define Singleton(ClassName) \
static ClassName &instance() {\
static ClassName *m_instance = 0;\
if (m_instance == 0)\
m_instance = new ClassName;\
return *m_instance;\
}
#define INI_BEGIN(FileName) \
class Inier {\
public:\
Singleton(Inier)\
private:\
Inier() {\
m_setter = new QSettings(FileName, QSettings::IniFormat);\
QStringList keys = m_setter->allKeys();\
foreach (QString key, keys) m_mapVals.insert(key, m_setter->value(key));\
}\
~Inier() {delete m_setter;}\
public:
#define INI_PARAM(Section, Type, Name, DefaultVal)\
Type get##Name() const { return m_mapVals.value(#Section"/"#Name, DefaultVal).value<Type>(); }\
void set##Name(const Type &Name) {\
Type val = get##Name();\
if (val == Name) return;\
val = Name;\
m_mapVals.insert(#Section"/"#Name, Name);\
setValue(#Section"/"#Name, Name);\
}
#define INI_END \
void setValue(const QString &name, const QVariant &val) { m_setter->setValue(name, val); m_setter->sync(); }\
QVariant value(const QString &name, const QVariant &defaultVal) { return m_setter->value(name, defaultVal); }\
private:\
QSettings *m_setter;\
QMap<QString, QVariant> m_mapVals;\
};
#define ini Inier::instance()
#endif // INIER_H
|
|