文章目录
- 0 起因
- 1 类代码
- 2 测试代码
- 3 代码下载
0 起因
写这类的原因的是每次操作QSettings的指针时候,用完都要delete指针,比较麻烦,可以使用类的析构函数自动删除。还有写入值的时候,QSettings类的成员函数setValue每次都会覆盖之前的值,因此自己写的类成员函数,可以选择保存原始的值,以及对即将插入的值去重复或者是插入不重复的值。
如有什么不足的地方,望大佬指出,谢谢。
1 类代码
//文件头
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&);//赋值操作符函数
};
// INIFILE_H
文件体:
//#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 测试代码
//测试
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 代码下载