QT之xml文件读写

思路

将指定路径下的xml文件读取到列表中
插入和删除按钮仅完成界面上的插入,不对xml文件进行操作
保存按钮,清空xml文件,并遍历界面列表中的数据存入xml文件

1. pro文件中引入xml库

#添加xml库
QT       += core gui xml

2. .h文件

#ifndef TESTXML_H
#define TESTXML_H

#include <QMainWindow>
#include <QDomComment>//QDomNodeList头文件
#include <QDir>
#include <QFile>
#include <QDebug>
#include <QPushButton>

namespace Ui {
class TestXml;
}

class TestXml : public QMainWindow
{
    Q_OBJECT

public:
    explicit TestXml(QWidget *parent = nullptr);
    ~TestXml();


private slots:
    void on_pushButton_wXml_clicked();//写入xml数据

    void on_pushButton_rXml_clicked();//读取xml数据

    void on_pushButton_insert_clicked();//插入

    void on_deleteBtn_slot();//删除

private:
    Ui::TestXml *ui;

    QFile m_file;

    QString currFilePath;   //当前文件路径

    QString currFileName;   //当前文件名字
};

#endif // TESTXML_H

3…cpp文件

#include "testxml.h"
#include "ui_testxml.h"

TestXml::TestXml(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::TestXml)
{
    ui->setupUi(this);

    QDir dir;
    currFilePath = "D:/wmt/test/TestXml";//根据自己的目录来写
    currFileName = "/TestXml.xml";//文件名
}

TestXml::~TestXml()
{
    delete ui;
}

void TestXml::on_pushButton_rXml_clicked()
{
    m_file.setFileName(currFilePath + currFileName);        //没有则创建文件
    if(! m_file.open(QIODevice::ReadOnly | QFile::Text))
    {
        qDebug() << " Read Open false";
        return;
    }

    QDomDocument doc;
    if(!doc.setContent(&m_file))
    {
        m_file.close();
        qDebug() << " Read Open Xml false";
        return;
    }

    int rowNum=  ui->tableWidget->rowCount();
    for(int i = 0 ; i < rowNum ; i++)//清空列表
    {
        ui->tableWidget->removeRow(0);
    }

    QDomElement root = doc.documentElement();           //读取根节点
    QDomNode node = root.firstChild();                  //读取第一个父节点

    while(!node.isNull())
    {
        QDomNodeList sonList = node.childNodes();       //读取子结点集合
        QString rootName = node.toElement().tagName();  //读取父节点名字
        if(rootName.compare("people") == 0) //读取子结点数据
        {
            int row=ui->tableWidget->rowCount();//表格行数
            ui->tableWidget->insertRow(row);
            for(int sonNode = 0;sonNode < sonList.size();sonNode++)
            {
                QDomElement sonElement = sonList.at(sonNode).toElement();       //获取子结点
                if(sonElement.toElement().tagName().compare("Id") == 0)          //与取出子结点进行对比
                {
                    ui->tableWidget->setItem(row,0,new QTableWidgetItem(sonElement.text()));
                }
                else if(sonElement.toElement().tagName().compare("Name") == 0)
                {
                    ui->tableWidget->setItem(row,1,new QTableWidgetItem(sonElement.text()));
                }
                else if(sonElement.toElement().tagName().compare("Sex") == 0)
                {
                    ui->tableWidget->setItem(row,2,new QTableWidgetItem(sonElement.text()));
                }
            }
            QPushButton *btn=new QPushButton;
            btn->setText("删除");
            btn->setStyleSheet("QPushButton{border:none;background:transparent;}");

            ui->tableWidget->setCellWidget(row,3,btn);

            connect(btn,SIGNAL(clicked()),this,SLOT(on_deleteBtn_slot()));
        }
        node = node.nextSibling();                      //读取下一父节点
    }
    m_file.close();
}

//读取xml数据
void TestXml::on_pushButton_wXml_clicked()
{
    m_file.setFileName(currFilePath + currFileName);        //没有则创建文件
    if(!m_file.open(QIODevice::ReadWrite | QIODevice::Truncate | QFile::Text))
    {
        qDebug() << " Write Open false";
        return;
    }

    QDomDocument doc;
    QDomProcessingInstruction version;
    version = doc.createProcessingInstruction("xml","version = \"1.0\" encoding = \"GB2312\"");
    doc.appendChild(version);

    QDomElement root = doc.createElement("data");   //创建顶节点
    doc.appendChild(root);

    for(int i=0;i<ui->tableWidget->rowCount();i++)
    {
        QDomElement itemRootElement = doc.createElement("people"); //创建父节点
        {
            QDomElement node1 = doc.createElement("Id");           //创建子结点
            QDomText domText1 = doc.createTextNode("Id");
            domText1.setData(ui->tableWidget->item(i,0)->text());  //设置子结点数据
            node1.appendChild(domText1);                           //将子节点数据绑定
            itemRootElement.appendChild(node1);                    //将子节点绑定到父节点

            QDomElement node2 = doc.createElement("Name");
            QDomText domText2 = doc.createTextNode("Name");
            domText2.setData(ui->tableWidget->item(i,1)->text());
            node2.appendChild(domText2);
            itemRootElement.appendChild(node2);

            QDomElement node3 = doc.createElement("Sex");
            QDomText domText3 = doc.createTextNode("Sex");
            domText3.setData(ui->tableWidget->item(i,2)->text());
            node3.appendChild(domText3);
            itemRootElement.appendChild(node3);
        }
         root.appendChild(itemRootElement);                        //绑定到顶结点
    }

    m_file.write(doc.toString().toLocal8Bit().data());
    m_file.close();
}

//插入
void TestXml::on_pushButton_insert_clicked()
{
    if(ui->lineEdit_id->text().isEmpty() || ui->lineEdit_name->text().isEmpty())
    {
        qDebug()<<"输入内容为空";
        return;
    }

    QPushButton *btn=new QPushButton;
    btn->setText("删除");
    btn->setStyleSheet("QPushButton{border:none;background:transparent;}");

    int row = ui->tableWidget->rowCount();
    ui->tableWidget->insertRow(row);
    ui->tableWidget->setItem(row,0,new QTableWidgetItem(ui->lineEdit_id->text()));
    ui->tableWidget->setItem(row,1,new QTableWidgetItem(ui->lineEdit_name->text()));
    ui->tableWidget->setItem(row,2,new QTableWidgetItem(ui->comboBox_sex->currentText()));
    ui->tableWidget->setCellWidget(row,3,btn);

    connect(btn,SIGNAL(clicked()),this,SLOT(on_deleteBtn_slot()));

    ui->lineEdit_id->clear();//清除输入框
    ui->lineEdit_name->clear();
}

//删除
void TestXml::on_deleteBtn_slot()
{
    ui->tableWidget->removeRow(ui->tableWidget->currentRow());
}

4. xml文件如下

在这里插入图片描述

5. 运行效果图

在这里插入图片描述

源码下载链接

https://download.csdn.net/download/WMT1520/21738505

参考链接:

https://blog.csdn.net/weixin_43519792/article/details/106366530

  • 9
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
你可以使用QtQtCore和QtXml模块来读写XML文件。下面是一个简单的示例代码,展示了如何使用Qt读取XML文件和写入XML文件: ```cpp #include <QtXml/QtXml> #include <QtCore/QFile> #include <QtCore/QIODevice> int main() { // 读取XML文件 QFile file("example.xml"); if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) { qDebug() << "Failed to open XML file for reading."; return -1; } QDomDocument doc; if (!doc.setContent(&file)) { qDebug() << "Failed to parse XML."; file.close(); return -1; } file.close(); // 遍历XML数据 QDomElement root = doc.documentElement(); QDomNodeList nodes = root.childNodes(); for (int i = 0; i < nodes.count(); i++) { QDomNode node = nodes.at(i); if (node.isElement()) { QDomElement element = node.toElement(); qDebug() << "Element name:" << element.tagName(); qDebug() << "Element value:" << element.text(); } } // 写入XML文件 QFile outputFile("output.xml"); if (!outputFile.open(QIODevice::WriteOnly)) { qDebug() << "Failed to open output XML file."; return -1; } QTextStream stream(&outputFile); doc.save(stream, 4); // 缩进为4个空格 outputFile.close(); return 0; } ``` 上述示例代码首先打开一个XML文件进行读取,然后使用`QDomDocument`类解析XML数据。通过遍历`QDomDocument`对象的子节点,可以获得每个元素的标签名和文本值。最后,将解析后的XML数据保存到新的XML文件中。 请注意,上述代码中使用的XML文件名为"example.xml"和"output.xml",你可以根据自己的需要修改这些文件名。此外,你需要在.pro文件中添加`QT += xml`以包含QtXml模块。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值