思路

将指定路径下的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_OBJECTpublic: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

QT之xml文件读写相关推荐

  1. 【Qt】 XML流读写XML

    00. 目录 文章目录 00. 目录 01. 概述 02. 开发环境 03. 读取XML文档 04. 写入XML文档 05. 预留 06. 附录 01. 概述 从Qt 4.3开始引入了两个新的类来读取 ...

  2. java基础 day12-FileInputStream类,文件的复制,缓冲流,Propertes文件,xml文件读写,网络socket编程(构建TCP客户端),内部类

    FileInputStream类的其他常用方法() /**在project下新建temp文件,内容为abcdef*FileInputStream类的其他常用方法:* int available():返 ...

  3. [QT操作XML]QT读写XML文件,QT修改XML文件

    [QT操作XML]QT读写XML文件 XML简介 QT操作XML,写入.读取.修改 XML效果演示 XML简介 概念:Extensible Markup Language 可扩展标记语言(可扩展:标签 ...

  4. qt中xml文件的更新

    引言 这篇文章与其说是xml文件的更新,不如说是修改xml文件中之前的某些值. 示例 该文章依旧是基于之前的读写xml文章的基础,找到xml文件中每个节点的ip,查找最新的数据中是否含有xml文件中该 ...

  5. 爪哇国新游记之十三----XML文件读写

    /*** XML读写示例* @author hx**/ public class XmlReaderWriter{/*** 读取一个XML文件,返回一个雇员链表* @param fileName* @ ...

  6. Qt操作XML文件(创建,读,写,修改,添加,删除)

    XML文件在项目开发的过程中经常用的,比如配置文件基本上都是XML格式的,本文介绍在Qt环境下操作XML文件,具体用法看代码 原txt文件内容,在 http://www1.jctrans.com/to ...

  7. java sitemap_JAVA 针对 sitemap.xml 文件读写修改操作

    UDP 是User Datagram Protocol的简称, 中文名是用户数据报协议,是OSI(Open System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层 ...

  8. Qt中的文件读写几种方式

    文章目录 文件读写 读文件 直接使用QFile类读文件 使用QTextstream的 readLine()或者readAll()读文件,readAll()不适合大文件 写文件(保存) 使用QTextS ...

  9. Android XML文件读写

    <?xml version="1.0" encoding="UTF-8"?> <persons>     <person id=& ...

最新文章

  1. 报错解决方案:ERROR: Cython.Build.cythonize not found.
  2. C# 视频监控系列(15):总结贴——可能用到的C# WinForm技术小结
  3. java语音读字符串_Android Java文本到语音查看额外的字符串信息
  4. 项目解析jsx文件_仅含一个源文件:这5个开源项目值得一看
  5. LeetCode Rearrange String k Distance Apart
  6. 【SpringCloud Eureka源码】从Eureka Client发起注册请求到Eureka Server处理的整个服务注册过程(下)...
  7. java Process在windows的使用汇总(转)
  8. python3 pyqt5 和eric5配置教程
  9. hp-unix 自带磁带机备份数据
  10. 杭州电子科技大学acm--2016
  11. 阅读材料:信息技术年谱
  12. ETA4322耐压30V,线性充1000mA,充电电流可调,双灯指示
  13. Androidstudio检测不到夜深模拟器解决方法
  14. 微信7.0fiddler、Charles抓包报HTTPS证书信任问题通报
  15. 前端之Html+Css实现动画的方法
  16. c++/win32实现模拟windows鼠标键盘操作
  17. 消息称华为麒麟 A2 处理器已有量产能力,海思将率先在可穿戴设备领域回归
  18. 英飞凌TC264之PWM舵机控制
  19. JavaWeb企业财务|记账|账单管理系统设计与实现(含源码+论文+答辩PPT等)
  20. 草图大师里创建动态组件_【干货】SketchUp建模|教你做一个有生命的家具动态组件...

热门文章

  1. SAP中成本中心实际/计划/差异报表查询实例
  2. 史上最全BigDecimal的5种进位方式:ROUND_UP,ROUND_DOWN,ROUND_CEILING,ROUND_FLOOR,ROUND_HALF_UP,ROUND_HALF_DOWN的比较
  3. Mathematica note
  4. 网易开源的分布式存储系统 Curve 正式成为 CNCF 沙箱项目
  5. okhttp3调用接口超时
  6. 8255实现数码显示管显示两位数字
  7. Android音视频点/直播模块开发
  8. java 图片 转像素_使用Java改变图片的像素
  9. 三菱系统四轴正反转参数_三菱第四轴参数
  10. 刷机前忘记退出Google账号解决方案