Qml的使用
下面是带有详细注释的代码:
#include "mainwindow.h" // 引入MainWindow类的定义
#include "ui_mainwindow.h" // 引入UI类的定义,用于设置界面
#include <QDomDocument> // 包含处理DOM文档所需功能
#include <QFile> // 包含文件操作的功能
#include <QApplication> // 包含应用程序的主要功能
#include <QMessageBox> // 包含消息框的功能
#include <QTextStream> // 包含文本流的功能
#include <QDebug> // 包含调试输出的功能
// 定义一个宏,用于输出当前函数名和行号
#define PRINT_FUNCTION_AND_LINE qDebug() << "当前函数:" << Q_FUNC_INFO << " 行号:" << __LINE__
// MainWindow构造函数
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent), // 初始化父对象为parent,并调用基类QMainWindow的构造函数
ui(new Ui::MainWindow) // 创建一个MainWindow UI对象
{
ui->setupUi(this); // 设置UI
}
// MainWindow析构函数
MainWindow::~MainWindow()
{
delete ui; // 删除UI对象释放内存
}
// 读取XML文件的函数
void MainWindow::readXml(const QString &filePath)
{
PRINT_FUNCTION_AND_LINE; // 输出当前函数名和行号
QDomDocument doc; // 创建一个DOM文档对象
QFile file(filePath); // 创建一个文件对象,指定文件路径
if (!file.open(QIODevice::ReadOnly | QIODevice::Text)) // 尝试以只读文本模式打开文件
{
qDebug() << "无法打开文件"; // 如果打开失败,则输出错误信息
return; // 退出函数
}
if (!doc.setContent(&file)) // 将文件内容解析成DOM树
{
qDebug() << "无法解析XML文件"; // 如果解析失败,则输出错误信息
return; // 退出函数
}
QDomElement root = doc.documentElement(); // 获取DOM树的根元素
QDomElement heroElement = root.firstChildElement("Hero"); // 获取第一个<Hero>元素
while (!heroElement.isNull()) // 当还有<Hero>元素时
{
QDomElement idElement = heroElement.firstChildElement("id"); // 获取<Hero>元素下的第一个<id>元素
QDomElement nameElement = heroElement.firstChildElement("Name"); // 获取<Hero>元素下的第一个<Name>元素
QDomElement descElement = heroElement.firstChildElement("Desc"); // 获取<Hero>元素下的第一个<Desc>元素
int id = idElement.text().toInt(); // 获取<id>元素的内容,并转换为整数
QString name = nameElement.text(); // 获取<Name>元素的内容
QString desc = descElement.text(); // 获取<Desc>元素的内容
qDebug() << "ID:" << id << ", Name:" << name << ", Desc:" << desc; // 输出英雄的信息
heroElement = heroElement.nextSiblingElement("Hero"); // 指向下一个<Hero>元素
}
file.close(); // 关闭文件
}
// 写入XML文件的函数
void MainWindow::writeXml(const QString &filePath)
{
PRINT_FUNCTION_AND_LINE; // 输出当前函数名和行号
QDomDocument doc; // 创建一个DOM文档对象
QDomElement root = doc.createElement("root"); // 创建一个名为“root”的元素
doc.appendChild(root); // 将根元素附加到文档
QDomElement heroElement = doc.createElement("Hero"); // 创建一个名为“Hero”的元素
QDomElement idElement = doc.createElement("id"); // 创建一个名为“id”的元素
QDomText idText = doc.createTextNode("10086"); // 创建一个文本节点,内容为“10086”
idElement.appendChild(idText); // 将文本节点附加到id元素
heroElement.appendChild(idElement); // 将id元素附加到Hero元素
QDomElement nameElement = doc.createElement("Name"); // 创建一个名为“Name”的元素
QDomText nameText = doc.createTextNode("张辽"); // 创建一个文本节点,内容为“张辽”
nameElement.appendChild(nameText); // 将文本节点附加到Name元素
heroElement.appendChild(nameElement); // 将Name元素附加到Hero元素
QDomElement descElement = doc.createElement("Desc"); // 创建一个名为“Desc”的元素
QDomText descText = doc.createTextNode("五子良将"); // 创建一个文本节点,内容为“五子良将”
descElement.appendChild(descText); // 将文本节点附加到Desc元素
heroElement.appendChild(descElement); // 将Desc元素附加到Hero元素
root.appendChild(heroElement); // 将Hero元素附加到根元素
QFile file(filePath); // 创建一个文件对象,指定文件路径
if (!file.open(QIODevice::WriteOnly | QIODevice::Text)) // 尝试以只写文本模式打开文件
{
qDebug() << "无法打开文件" << file.errorString(); // 如果打开失败,则输出错误信息
return; // 退出函数
}
QTextStream out(&file); // 创建一个文本流用于写入文件
doc.save(out, 4); // 使用缩进为4个空格的方式保存文档到流
file.close(); // 关闭文件
}
// 按钮点击事件处理函数 - 读取按钮
void MainWindow::on_pushButtonRead_clicked()
{
readXml(QStringLiteral("./file.xml")); // 调用读取XML文件的函数
}
// 按钮点击事件处理函数 - 写入按钮
void MainWindow::on_pushButtonWrite_clicked()
{
writeXml(QStringLiteral("./file.xml")); // 调用写入XML文件的函数
}
这个代码片段定义了一个MainWindow
类,其中包括了读取和写入XML文件的功能。通过按钮点击事件触发读取或写入操作,并且在控制台上打印出相应的调试信息。此外,还使用了宏来记录函数名和行号,便于调试。