四时宝库

程序员的知识宝库

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

一、背景

  不得不说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文件,需要的接口并不多,读、写、新增和删除。

图1 QSettings读写ini

三、xml文件读写

  读写xml文件的方式有很多,Qt提供了2种比较常用的方式:DOM和SAX,详情可以参看:Qt学习之XML读写操作小结。初次之外C++还提供了几种库用于操作xml文件,比如:libxml2、tinyXml等。
此处我们模拟的是QSettings读写ini文件,因此使用Qt自带的DOM方式读写xml,操作起来相对容易。

  如图2所示,是我们xml文件操作类的几个重要接口和成员,前边4个公有接口分别对应。读、写、新增和删除;成员变量m_filePath表示加载的xml文件路径,m_mItemMap表示2级的ini文件结构

图2 xml文件操作头文件

1、读xml文件

View Code

2、保存xml文件

View Code

3、插入项

Bash
 1 bool xmlOperate::addItem( const QString & value, const QString & group, const QString & key )
 2 {
 3     if (value.isEmpty() || group.isEmpty())
 4     {
 5         return false;
 6     }
 7 
 8     if (key.isEmpty())
 9     {
10         int count = m_mItemMap[group].size();
11         m_mItemMap[group][QString::number(count)] = value;
12     }
13     else
14     {
15         m_mItemMap[group][key] = value;
16     }
17 
18     writeXml(m_filePath);
19 
20     return true;
21 }

4、删除项

Bash
 1 bool xmlOperate::removeItem( const QString & value, const QString & group, const QString & key /*= ""*/ )
 2 {
 3     if (value.isEmpty() || group.isEmpty())
 4     {
 5         return false;
 6     }
 7 
 8     if (key.isEmpty())
 9     {
10         int count = m_mItemMap[group].size();
11         if (count == 0)
12         {
13             return false;
14         }
15         
16         auto iter = m_mItemMap[group].begin();
17         while (iter != m_mItemMap[group].end())
18         {
19             if (iter.value() == value)
20             {
21                 iter = m_mItemMap[group].erase(iter);
22             }
23             else
24             {
25                 ++iter; 
26             }
27         }
28     }
29     else
30     {
31         m_mItemMap[group].remove(key);
32     }
33 
34     writeXml(m_filePath);
35 
36     return true;
37 }

四、示例程序下载

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

图3 测试程序结果

发表评论:

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言
    友情链接