当前位置: 首页 > article >正文

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文件的功能。通过按钮点击事件触发读取或写入操作,并且在控制台上打印出相应的调试信息。此外,还使用了宏来记录函数名和行号,便于调试。


http://www.kler.cn/news/362211.html

相关文章:

  • (三十二)实现一个基本的文件上传功能的Flask应用
  • 探索 Web Audio API 的奇妙世界
  • Tailwind Starter Kit 一款极简的前端快速启动模板
  • 【日志】Unity3D模型导入基本问题以及浅谈游戏框架
  • 梧桐数据库的行转列
  • 演示:基于WPF的DrawingVisual开发的高刷新率示波器
  • Unity加载界面制作
  • Docker:安装 Syslog-ng 的技术指南
  • Build an Android project and get a `.apk` file on a Debian 11 command line
  • Java项目-基于Springboot的车辆充电桩项目(源码+说明).zip
  • c++基础算法练习(1)
  • Android SELinux——调试工具audio2allow介绍(十三)
  • Linux系列-Linux的常见指令(三)
  • 错误0x80070522:客户端没有所需的特权
  • C++ set和map的模拟实现
  • 在Debian上安装向日葵
  • 深度学习-卷积神经网络-基于VGG16模型, 实现猫狗二分类(文末附带数据集下载链接, 长期有效)
  • oracle_查询建表语句
  • 【毕业设计】基于SpringBoot的网上商城系统
  • 【C语言刷力扣】2006.差的绝对值为K的数对数目
  • CTFHUB技能树之SQL——布尔盲注
  • 前端模块化技术 IIFE、CMD、UMD
  • 智能去毛刺:2D视觉引导机器人如何重塑制造业未来
  • MySQL 指定字段排序
  • 信息搜集 --前端js打点
  • 九、SQL 进阶之路:深入探索数据库查询的艺术