Qt配置文件之Xml

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

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

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

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

程序平台:ubuntu、 Qt 5.5.1

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


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光明