您的位置:首页 > 编程语言 > Qt开发

Qt之QDomDocument操作xml文件-模拟ini文件存储

2018-07-13 15:44 399 查看

一、背景

  不得不说Qt是一个很强大的类库,不管是做项目还是做产品,Qt自身封装的东西就已经非常全面了,我们今天的这篇文章就是模拟了Qt读写ini文件的一个操作,当然是由于一些外力原因,我们决定自己来完善下这个功能。好的,那么现在就让我们隆重的请出今天的主角--QSettings。这个类能干嘛呢? 答案就是:读写注册表或者读写ini文件,这对于我们做应用程序时记录一些可持久化数据非常有用。

二、QSettings访问ini文件

  QSettings访问ini文件相对来说比较简单,我们只需要构造一个QSettings对象,传入文件名称和文件存储格式即可,如图1所示。但同时QSettings也有一些局限,如下:
1、QSettings的编码问题(QTBUG15543、QTBUG19552)
2、QSettings的key不能为中文
3、当在一个嵌套作用域多次构造QSettings时并设置了编码,此时访问文件设置的编码会失效
  由于QSettings有一些限制,也就引出了我们这篇文章的内容,使用xml模拟ini文件,下面我们主要分析下怎么使用xml文件模拟ini文件,需要的接口并不多,读、写、新增和删除。

void xmlOperate::writeXml(const QString & filePath)
{
QDomDocument domDocument;
QString strHeader( "version=\"1.0\" encoding=\"UTF-8\"" );
domDocument.appendChild( domDocument.createProcessingInstruction("xml", strHeader) );

QDomElement root = domDocument.createElement("groups");
domDocument.appendChild(root);

for(auto iter = m_mItemMap.begin(); iter != m_mItemMap.end(); ++iter)
{
QDomElement groupNode = domDocument.createElement("group");
groupNode.setAttribute("name", iter.key());

QMap<QString, QString> items = iter.value();
for (auto iter2 = items.begin(); iter2 != items.end(); ++iter2)
{
QString key = iter2.key();
QString value = iter2.value();

QDomElement itemNode = domDocument.createElement("item");
itemNode.setAttribute("name", key);

QDomText textNode = domDocument.createTextNode(value);
itemNode.appendChild(textNode);

groupNode.appendChild(itemNode);
}
root.appendChild(groupNode);
}

QFile file(filePath);
if(file.open(QFile::WriteOnly | QFile::Text))
{
QTextStream out(&file);
domDocument.save(out, 4);
file.close();
}
qDebug() << m_mItemMap;
}
View Code [p]3、插入项

bool xmlOperate::addItem( const QString & value, const QString & group, const QString & key )
{
if (value.isEmpty() || group.isEmpty())
{
return false;
}

if (key.isEmpty())
{
int count = m_mItemMap[group].size();
m_mItemMap[group][QString::number(count)] = value;
}
else
{
m_mItemMap[group][key] = value;
}

writeXml(m_filePath);

return true;
}

4、删除项

bool xmlOperate::removeItem( const QString & value, const QString & group, const QString & key /*= ""*/ )
{
if (value.isEmpty() || group.isEmpty())
{
return false;
}

if (key.isEmpty())
{
int count = m_mItemMap[group].size();
if (count == 0)
{
return false;
}

auto iter = m_mItemMap[group].begin();
while (iter != m_mItemMap[group].end())
{
if (iter.value() == value)
{
iter = m_mItemMap[group].erase(iter);
}
else
{
++iter;
}
}
}
else
{
m_mItemMap[group].remove(key);
}

writeXml(m_filePath);

return true;
}

四、示例程序下载

如图3是测试代码生成的测试结果,group相当于ini文件中的一个分组,item表示分组中的一项

[/p]

图3 测试程序结果

xml读写-xml模拟ini存储

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: