1. ini配置文件的组成
[section] // 节名
key = value //键 = 值
2. 关于QSettings
QSettings的API是基于Qvariant,它包含了大部分通常的Qt数据类型,比如QString,QRec,QImage,等等。
当创建一个Qsettings的对象时,需要传递给它两个参数,第一个是组织的名称,第二个是应用程序的名称。
更多关于QSettings
QSettings::NativeFormat 使用平台最合适的存储格式设置。在Windows中,使用系统注册表;OS X和iOS中,使用的是CFPreferences API;在Unix中,使用的是conf格式的文本配置文件
QSettings::IniFormat 存储在INI文件中的设置。
QSettings::InvalidFormat registerFormat()返回的值
QVariant value( const QString &key) const
获取键值
void setValueconst QString &key, const QString &value)
设置键值
QStringList allKeys() const
返回所有的key,以list形式
QString applicationName() const
返回应用程序名称
QString fileName() const
返回写入注册表地址,或ini文件路径
void beginGroup(const QString &prefix)
自动添加group到指定的key
void endGroup()
恢复group为在调用beginGroup之前的group
int beginReadArray(const QString &prefix);
向当前组添加前缀并从数组开始读取。返回数组的大小。
void beginWriteArray(const QString &prefix, int size = -1);
向当前组添加前缀并开始编写大小大小的数组。如果大小为-1(默认值),则根据条目的索引自动确定。
void remove(const QString &key);
清除key及其所对应的value
3. QSettings封装
//settings.h
#pragma once
#ifndef SETTING_H
#define SETTING_H
#include <QSettings>
#include <QSharedPointer>
#include <QTextCodec>
#include <QCoreApplication>
#include <QFile>
class IniSettings
{
public:
QSharedPointer<QSettings> m_iniFile;
public:
void settings_init(const QString &path); //初始化QSettings对象,并读取ini配置文件,如果不存在配置文件,则创建
void setValue(const QString §ion, const QString &key, const QString &value); //写入配置项(section:节点,key:键名,value:键值)
void removeNode(const QString §ion); //移除节点(包括其中所有的键值)
void removeKey(const QString §ion, const QString &key); //移除节点中的某个键值
QString getValue(const QString §ion, const QString &key, const QString &defaultValue); //读配置项
QStringList getValueList(const QString §ion, const QString &key, QString defaultValue = ""); //批量读取
};
#endif // SETTING_H
//settings.cpp
#include "settings.h"
void IniSettings::settings_init(const QString &path)
{
/*QString fileName;
fileName = QCoreApplication::applicationDirPath();
fileName += path;*/
m_iniFile = QSharedPointer<QSettings>(new QSettings(path, QSettings::IniFormat));
//确保中文能使用
//注意此处使用的编码取决于ini文件的编码格式,例如ini使用的是UTF-8则使用UTF-8
m_iniFile->setIniCodec(QTextCodec::codecForName("UTF-8"));
/*QFile file(path);
if (false == file.open(QIODevice::ReadOnly | QIODevice::Text))
{
m_iniFile->beginGroup("section");
m_iniFile->setValue("status", "false");
m_iniFile->endGroup();
}*/
}
void IniSettings::setValue(const QString §ion, const QString &key, const QString &value)
{
m_iniFile->beginGroup(section); // 设置节点名
m_iniFile->setValue(key, value); //设置键名和键值
m_iniFile->endGroup(); // 结束当前节的操作
}
void IniSettings::removeNode(const QString §ion)
{
m_iniFile->remove(section);
}
void IniSettings::removeKey(const QString §ion, const QString &key)
{
/*QString path = QString("%1/%2").arg(section).arg(key);
m_iniFile->remove(path);*/
m_iniFile->beginGroup(section);
m_iniFile->remove(key);
m_iniFile->endGroup();
}
QString IniSettings::getValue(const QString §ion, const QString &key, const QString &defaultValue)
{
QString path = QString("%1/%2").arg(section).arg(key);
QString result = m_iniFile->value(path, defaultValue).toString();
return result;
}
QStringList IniSettings::getValueList(const QString & section, const QString & key, QString defaultValue)
{
QVariant variant = m_iniFile->value(QString("%1/").arg(section) + key);
QStringList list = variant.value<QStringList>();
return list;
}