一、背景

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

Qt之QDomDocument操作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文件结构

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

图2 xml文件操作头文件

1、读xml文件

 1 void xmlOperate::readXml( const QString & filePath )
 2 {
 3     if(filePath.isEmpty())
 4         return;
 5 
 6     QFile file(filePath);
 7     if(file.open(QFile::ReadOnly | QFile::Text) == false)
 8         return;
 9 
10     QDomDocument domDocument;
11     QString error;
12     int row = 0, column = 0;
13     if(domDocument.setContent(&file, false, &error, &row, &column) == false)
14         return file.close();
15 
16     if(domDocument.isNull()) 
17         return file.close();
18 
19     m_mItemMap.clear();
20 
21     QDomElement rootElement = domDocument.documentElement();
22     QDomNodeList groupList = rootElement.childNodes();
23     for(int i = 0; i < groupList.count(); ++i)
24     {
25         QDomNode groupNode = groupList.item(i);
26         QDomElement groupElement = groupNode.toElement();
27         QString groupName = groupElement.attribute("name");
28 
29         QMap<QString, QString> items;
30         QDomNodeList itemList = groupElement.childNodes();
31         for (int j = 0; j < itemList.count(); ++j)
32         {
33             QDomNode itemNode = itemList.item(j);
34             QDomElement itemElement = itemNode.toElement();
35             QString itemName = itemElement.attribute("name");
36             QString itemText = itemElement.text();
37 
38             if (itemName.isEmpty())
39             {
40                 items[QString::number(j)] = itemText;
41             }
42             else
43             {
44                 items[itemName] = itemText;
45             }
46         }
47         m_mItemMap[groupName] = items;
48     }
49 
50     file.close();
51 
52     qDebug() << m_mItemMap;
53 }
View Code

相关文章:

  • 2022-12-23
  • 2021-12-12
  • 2021-05-25
  • 2022-01-07
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2021-06-15
猜你喜欢
  • 2022-12-23
  • 2021-09-23
  • 2021-12-03
  • 2021-07-07
  • 2022-02-07
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案