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

发布了91 篇原创文章 · 获赞 94 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/ACK_ACK/article/details/103175251