39

Qt配置文件之Xml

 4 years ago
source link: http://mp.weixin.qq.com/s?__biz=MzUxMTk4MzY3MA%3D%3D&%3Bmid=2247484133&%3Bidx=1&%3Bsn=65ccc2c7ed0d56785c1c34780f821b90
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

点击上方蓝字可关注公众号呦,方便下次阅读~

XML(可扩展标记语言)文件本身不能对自己“做出”任何操作。它们是存储数据的一种简单方式,而存储的数据可以被其它软件轻松读取。很多程序都会使用可扩展标记语言( XML )来存储数据。XML可用来存储数据、携带数据和交换数据,不是为了显示数据而设计的。

配置文件在程序中的应用还是很常见的,如我们需要启动一个Socket 的客户端去连接远程的 Server, 这时需要设置服务器的 IpPort 。当我们本次设置完成后,下次再使用的时候希望程序“记录”这个 IpPort ,我们直接连接即可,而不是要求用户再输入一次。面对这种需要“记录”的功能,我们可以使用配置文件。

对于数量不多的配置信息,我们可以使用QSettings进行记录,而对于一些复杂而且数量较多的配置信息,我们则可以使用配置文件。如 Xml 配置文件、 Json 配置文件等。

程序平台:ubuntu、 Qt 5.5.1

程序配置文件的主体功能:构造一个配置信息的结构体ConfigInfo,用于存储需要记录的信息,在点击 Save 按钮时写入配置文件,在构造函数中读取配置信息。当我们下次再运行程序时,读取配置文件后,将我们上次保存的信息显示到 UI 界面上。该 Demo 是用来记录 IpPort 的。

iqeAviy.png!web

1. 写Xml文件函数

①生成 Xml 文件

void Widget::writeXmlConfig(const QString &fileName, ConfigInfo &configInfo)

{

QDomDocument doc;

QDomProcessingInstructioninstruction= doc.createProcessingInstruction("xml","version=\"1.0\"encoding=\"UTF-8\"");

doc.appendChild(instruction);


QDomElement root = doc.createElement("Config");//创建根节点

doc.appendChild(root); //添加根节点

//ip

QDomElement strIP = doc.createElement("Ip");

root.appendChild(strIP); //添加元素节点到根节点

QDomText strIpText = doc.createTextNode(configInfo.ip);

strIP.appendChild(strIpText); //添加元素文本到元素节点

//port

QDomElement strPort = doc.createElement("Port");

root.appendChild(strPort); //添加元素节点到根节点

QDomText strPortText = doc.createTextNode(QString::number(configInfo.port));

strPort.appendChild(strPortText); //添加元素文本到元素节点



saveXmlConfig(fileName, doc);


}

②写入完成后保存到文件中:

void Widget::saveXmlConfig(const QString &fileName, QDomDocument &doc)

{

QDir m_dir("./testXmlConfig");

if(!m_dir.exists())

{

system("mkdir ./testXmlConfig");

}


QFile file(m_dir.absolutePath() + "/" + fileName);

if (!file.open(QIODevice::WriteOnly | QIODevice::Truncate | QIODevice::Text))

{

return;

}


QTextStream out(&file);

out.setCodec("UTF-8");

doc.save(out, 4, QDomNode::EncodingFromTextStream);

file.close();

}

2. 读取Xml文件

①读取Xml文件

void Widget::readXmlConfig(const QString &fileName, ConfigInfo &configInfo)

{

QFile file(fileName);

if(file.open(QIODevice::ReadOnly))

{

QDomDocument doc("testConfig");


if(doc.setContent(&file))

{

QDomElement root = doc.documentElement();

listDom(root,configInfo);

}


file.close();

}

}

②遍历存储的节点

void Widget::listDom(QDomElement &docElem,

ConfigInfo &configInfo)

{

QDomNode node = docElem.firstChild();

if(node.toElement().isNull())

{

return;

}


while(!node.isNull())

{

QDomElement element = node.toElement();


if(element.tagName() == "Ip")

{

configInfo.ip = element.text();

qDebug() << "test ip" << configInfo.ip;

}

if(element.tagName() == "Port")

{

configInfo.port = element.text().toInt();

qDebug() << "test port" << configInfo.port;

}


node = node.nextSibling();

}

}

以后有机会可以和大家介绍下读取Xml文件后将他们显示到Qt的TreeWidget上。

往期精选:Qt 中国象棋项目

Modbus 协议介绍及Modbus调试助手的使用

Qt 串口调试助手

Qt Socket 传输图片

Python 爬取天气状况发送给微信好友

Python Socket 传输图片

欢迎大家关注公众号: Pou光明

bMNFjmE.png!web


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK