文章目录

  • ​​0 起因​​
  • ​​1 类代码​​
  • ​​2 测试代码​​
  • ​​3 代码下载​​

0 起因

写这类的原因的是每次操作QSettings的指针时候,用完都要delete指针,比较麻烦,可以使用类的析构函数自动删除。还有写入值的时候,QSettings类的成员函数setValue每次都会覆盖之前的值,因此自己写的类成员函数,可以选择保存原始的值,以及对即将插入的值去重复或者是插入不重复的值。

如有什么不足的地方,望大佬指出,谢谢。

1 类代码

//文件头

#ifndef INIFILE_H
#define INIFILE_H

#include<QSettings>
#include <QString>
#include <QStringList>
#include <QDebug>

class IniFile
{
public:
IniFile():iniSetting(nullptr),isCoverWrite(true),isInsertDeduplication(false),isValueDeduplication(false){}
IniFile(QString);
~IniFile(){delete iniSetting;}

//获得值
//返回group的key下的value
QStringList getValue(const QString&,const QString&) const;
//返回所有key
QStringList getAllKey() const;
//返回group的所有key
QStringList getKey(const QString&) const;
//返回所有group
QStringList getGroup() const;
//返回当前ini文件的路径
QString getFilePath() const;
//在group的key下写入value
void saveValue(const QString& , const QString& , const QStringList&);

//打印信息
//打印所有组
void printAllGroup() const;
//打印所有key
void printAllKey() const;
//打印group下的所有key
void printKey(const QString&) const;
//打印group的key下的所有value
void printAllValue(const QString&,const QString&) const;
//打印所有group的全部信息
void printAllInfo() const;


//删除操作
//删除所有group
void clear();
//移除group下的key
void remove(const QString&, const QString&);
//移除group
void remove(const QString&);

//判断当前group下是否有key
bool hasKey(const QString&,const QString&) const;
bool hasGroup(const QString&) const;
bool hasValue(const QString&, const QString&, const QString&) const;

//打开或关闭写入和原值不重复的value
void onInsertDeduplication();
void offInsertDeduplication();
//打开或关闭对即将写的value去重
void onValueDeduplication();
void offValueDeduplication();
//打开或关闭覆盖写入value
void onCoverWrite();
void offCoverWrite();

private:
QSettings* iniSetting;//指向QSettings对象的指针
bool isCoverWrite;//是否覆盖写入value
bool isInsertDeduplication;//是否插入重复的value
bool isValueDeduplication;//对即将插入的值去重复
//不允许复制操作
IniFile(const IniFile&);//复制操作符函数
IniFile& operator=(const IniFile&);//赋值操作符函数
};

#endif // INIFILE_H

文件体:

#include "inifile.h"
#include <QVariant>
#include <QDebug>
//#include <QFileInfo>
IniFile::IniFile(QString fileName)
{
isInsertDeduplication = false;
isValueDeduplication = false;
isCoverWrite = true;
iniSetting = new QSettings(fileName,QSettings::IniFormat);
}

QStringList IniFile::getValue(const QString& group,const QString& key) const
{
QVariant variant = iniSetting->value(QString(group +"/" + key));
QStringList value = variant.value<QStringList>();
qDebug()<<"value:"<<value;
return value;
}

QStringList IniFile::getAllKey() const
{
return iniSetting->allKeys();
}

QStringList IniFile::getKey(const QString &group) const
{
iniSetting->beginGroup(group);
QStringList keyList = iniSetting->childKeys();
iniSetting->endGroup();
return keyList;
}

QStringList IniFile::getGroup() const
{
QStringList groupList = iniSetting->childGroups();
return groupList;
}

void IniFile::saveValue(const QString& group, const QString& key, const QStringList& values)
{
//结构
/*
* {isValue:1
isCover->
{noValue:2
//Cover->
[isInsert:3
{isValue->
[noInsert:4
noCover->
[isInsert:5
{noValue
[noInsert:6
*/
/// \brief resVariant
QVariant resVariant;
iniSetting->beginGroup(group);
if(isCoverWrite){//如果覆盖写入,则直接写入
if(isValueDeduplication){//即将插入的值去重
QStringList resValues;//新建QStringList去重
for(int i = 0; i < values.size() ;i++){
if(resValues.indexOf(values.at(i)) == -1){
resValues.push_back(values.at(i));
}
}
resVariant.setValue(resValues);
//qDebug()<<"test1";
}else{//即将插入的值不去重复
resVariant.setValue(values);
//qDebug()<<"test2";
}
}else{//不覆盖写入
QVariant variant = iniSetting->value(key);
QStringList originalValue = variant.value<QStringList>();
if(isValueDeduplication){//即将插入的值去重
if(isInsertDeduplication){//即将插入和原有值不同的值
foreach(QString tempValue, values){
if(originalValue.indexOf(tempValue) == -1){
originalValue.push_back(tempValue);
}
}
qDebug()<<"test3";
}else{//即将插入的值和原有值的值可以相同
QStringList resValues;//新建QStringList对即将插入的值去重
for(int i = 0; i < values.size() ;i++){
if(resValues.indexOf(values.at(i)) == -1){
resValues.push_back(values.at(i));
}
}
foreach(QString tempValue, resValues){
originalValue.push_back(tempValue);
}
}
qDebug()<<"test4";
}else{//即将插入的值不去重
if(isInsertDeduplication){//即将插入和原有值不同的值
QStringList resValues;
foreach(QString tempValue, values){
if(originalValue.indexOf(tempValue) == -1){
resValues.push_back(tempValue);
}
}
foreach(QString tempValue, resValues){
originalValue.push_back(tempValue);
}
qDebug()<<"test5";
}else{//即将插入的值和原有值可以相同
foreach(QString tempValue, values){
originalValue.push_back(tempValue);
}
qDebug()<<"test6";
}
}
resVariant.setValue(originalValue);
}
iniSetting->setValue(key, resVariant);
iniSetting->endGroup();

//在原有的基础上进行去重复
// for(int i = 0; i < values.size() ;i++){
// for(int j = i + 1; j < values.size(); j++){
// int indexFind = values.indexOf(values.at(i), j);
// if(indexFind != -1){
// values.removeAt(indexFind);
// }
// }
// }

}

void IniFile::printAllGroup() const
{
QStringList groupList = iniSetting->childGroups();
foreach (QString group, groupList) {
qDebug()<< "group:" << group ;
}
}

void IniFile::printAllKey() const
{
qDebug()<< iniSetting->allKeys();
}

void IniFile::printKey(const QString& group) const
{
iniSetting->beginGroup(group);
QStringList keyList = iniSetting->childKeys();
qDebug() <<"allKeys : " << keyList << endl;
iniSetting->endGroup();
}

void IniFile::printAllValue(const QString& group, const QString& key) const
{
iniSetting->beginGroup(group);
QVariant variant = iniSetting->value(key);
QStringList valueList = variant.value<QStringList>();
qDebug() << "values size:" <<valueList.size();
qDebug() <<"allValues:" << valueList;
iniSetting->endGroup();
}

void IniFile::printAllInfo() const
{
QStringList groupList = iniSetting->childGroups();
foreach(QString group, groupList){
qDebug() <<"group:" << group <<endl;
iniSetting->beginGroup(group);
QStringList keys = iniSetting->childKeys();
qDebug() <<"Keys : " << keys << endl;
foreach(QString key, keys)
{
QVariant variant = iniSetting->value(key);
QStringList values = variant.value<QStringList>();
qDebug() << "values size:" <<values.size() << endl;
qDebug() <<"allValues:" << values<< endl;
}
iniSetting->endGroup();
}
}

void IniFile::clear()
{
iniSetting->clear();
}

QString IniFile::getFilePath() const
{
return iniSetting->fileName();
}

void IniFile::onInsertDeduplication()
{
isInsertDeduplication = true;
}

void IniFile::offInsertDeduplication()
{
isInsertDeduplication = false;
}

void IniFile::onCoverWrite()
{
isCoverWrite = true;
}

void IniFile::offCoverWrite()
{
isCoverWrite = false;
}

void IniFile::remove(const QString& group, const QString& key)
{
iniSetting->beginGroup(group);
iniSetting->remove(key);
iniSetting->endGroup();
}

void IniFile::remove(const QString& group)
{
iniSetting->beginGroup(group);
iniSetting->remove("");
iniSetting->endGroup();
}

bool IniFile::hasKey(const QString &group, const QString &key) const
{
bool res;
iniSetting->beginGroup(group);
res = iniSetting->contains(key);
iniSetting->endGroup();
return res;
}

bool IniFile::hasGroup(const QString& group) const
{
QStringList groupList = iniSetting->childGroups();
// qDebug()<<"groupList:"<<groupList;
if(groupList.indexOf(group) == -1){
return false;
}else{
return true;
}
}

bool IniFile::hasValue(const QString& group, const QString& key, const QString& value) const
{
bool res;
iniSetting->beginGroup(group);
QVariant variant = iniSetting->value(key);
QStringList valueList = variant.value<QStringList>();
if(valueList.indexOf(value) == -1){
res = false;
}else{
res = true;
}
iniSetting->endGroup();
return res;
}

void IniFile::onValueDeduplication()
{
isValueDeduplication = true;
}

void IniFile::offValueDeduplication()
{
isValueDeduplication = false;
}

2 测试代码

//测试
#include "inifile.h"

int main(int argc, char *argv[])
{
QString fileName = QCoreApplication::applicationDirPath() + "/test.ini";
IniFile iniTest(fileName);

iniTest.offCoverWrite();//是否覆盖写入数据
iniTest.offValueDeduplication();//对新添的数据去重复
iniTest.offInsertDeduplication();//添加新数据时,根据原有的数据去重

QString group = "people";
QString group2 = "building";
QString key = "student";
QString key2 = "teacher";
QString key3 = "school";
QStringList values;
values.push_back("xiaoming");
values.push_back("xiaohua");
// values.push_back("xiaohei");
// values.push_back("xiaohei");
// values.push_back("xiaobai");
// values.push_back("xiaolan");
// values.push_back("heihei");
// values.push_back("xiaoming");

// values.push_back("kongzi");
// values.push_back("feienman");
//values.push_back("dannisiliqi");
values.push_back("qiaodan");
values.push_back("qinghua");
values.push_back("qinghua");
values.push_back("beida");
values.push_back("zhongkeda");

iniTest.saveValue(group, key, values);

// QStringList temp;

//测打印
// qDebug() << iniTest.getFilePath();
// iniTest.printKey(group);
//iniTest.printAllKey();
// iniTest.printAllGroup();
//iniTest.printAllValue(group2, key3);

//iniTest.remove(group2, key2);
//iniTest.remove(group);
// iniTest.clear();

// qDebug() << iniTest.getValue(group, key);


iniTest.printAllInfo();

// if(iniTest.hasKey(group, key) == true){
// qDebug() <<"Yes";
// }
// if(iniTest.hasGroup(group)){
// qDebug()<<"Yes";
// }
// if(iniTest.hasValue(group, key, QString("xiaohei"))){
// qDebug()<<"Yes";
// }

}

3 代码下载