Qt通过读取XML文件,绘制图形界面

2023-11-04

最近需要实现通过读取xml文件的形式动态绘制界面的需求,这样会很方便,在外界修改xml文件就可以了,不需要重新编译程序。

一:XML文件
XML的格式和一些说明,本文就不在介绍了,菜鸟教程有更清晰的入门介绍:菜鸟教程_XML

二:QT中读取XML的类和常用函数
QT中提供了一个读取XML文件的类:QXmlStreamReader
头文件:

#include <QXmlStreamReader>

这个类在使用时会创建一个读取xml文件的迭代器

QXmlStreamReader xmlReader(&filename); //xmlReader就是一个迭代器

该类常见的一些接口函数:

readNextStartElement();//挨个读入节点
isStartElement();//判断节点的开始
isEndElement();//判断节点的结束
name();//得到当前节点的名字
readElementText();//访问当前节点的内容
attributes();//获取还有属性节点的属性
atEnd();//判断XML文件是否结束
hasError();//判断XML文件是否出错

三:代码思路
XML文件实际上就是一个树状结构,所以需要一段一段的去读,先设置一个迭代器,找到根节点,然后去寻找根节点下面的内容,然后再对根节点中的内容进行判定,符合条件的执行代码,取出你想取出的数据,如果不需要就直接跳过,读完一个节点的内容接着转到下一个节点去,就是读完左节点再到中间节点,直到将根节点遍历结束,就是读完XML文件。

代码模式:
if(xmlReader.name() == "根节点名字" && xmlReader.isStartElement())
{
   xmlReader.readNextStartElement();
   while(!(xmlReader.name() == "根节点名字" && xmlReader.isEndElement())
   { 
        xmlReader.readNextStartElement();
        if(xmlReader.name() == "节点名字1" && xmlreader.isStartElement()) 
        {  
           while(!(xmlReader.name() == "节点名字1" && xmlReader.isEndElement())
           {      ......     }   
        }  
        else if(xmlReader.name() == "节点名字2" && xmlreader.isStartElement())
        {
           while(!(xmlReader.name() == "节点名字2" && xmlReader.isEndElement())
           {      ......     }    
        }   
   }
} 

四:代码实现
1,准备一个XMl文档:
testconfig.xml

<?xml version ="1.0" encoding ="utf-8"?>
<MSG>
  <Button id ="main_interface">
    <title>
	  <Name>主界面</Name>
      <Width>90</Width>
      <Height>40</Height>
      <Xcoordinate>250</Xcoordinate>
      <Ycoordinate>250</Ycoordinate>
    </title>
  </Button> 
</MSG>

2,新建一个config文件
config.h

#ifndef CONFIG_H
#define CONFIG_H
#include <QXmlStreamReader>
#include <QFile>
#include <QApplication>
#include <QDir>
#include <QDebug>

class config
{
public:
    config();
    //读取XML文件,并存到一个list容器里面
    QStringList readConfig();
};

#endif // CONFIG_H

config.cpp

#include "config.h"

config::config()
{

}

QStringList config::readConfig()
{
       //需要打开的文件
       QFile file;

       //节点的名字
       QString nodename;

       //最终输出的内容
       QStringList OutPut;
       //打开文件路径
       file.setFileName(qApp->applicationDirPath()+"/test_xml/testconfig.xml");
       if (!file.exists())
       {
           qDebug() << "testconfig.xml文件不存在";
       }
       else
       {
           qDebug() << "testconfig.xml文件存在";
       }
       //打开文件
       if(!file.open(QIODevice::ReadOnly | QIODevice::Text))
       {
           qDebug()<<"打开文件失败!";
       }
       else
       {
           //读取xml文件的迭代器
           QXmlStreamReader xmlreader(&file);
           qDebug() << "testconfig.xml文件存在,且打开文件成功!";

           //当文件没有结束且没有出错执行下面的代码
           while(!xmlreader.atEnd() || !xmlreader.hasError())
           {
               //找到非根节点下的第一个子节点
               xmlreader.readNextStartElement();
               //第一个子节点Button
               nodename = xmlreader.name().toString();
               //如果是第一个子节点的开始执行下列代码
               if(nodename == "Button" && xmlreader.isStartElement())
               {
                   //读取出附加信息
                   xmlreader.attributes().value("id").toString();
                   //添加到输出的字符串里
                   OutPut.append(QString("%1").arg(xmlreader.attributes().value("id").toString()));
                   //如果子节点中的内容没有结束
                   while(!(nodename == "Button" && xmlreader.isEndElement()))
                   {
                       //挨个读入节点
                       xmlreader.readNextStartElement();
                       nodename = xmlreader.name().toString();
                       if(nodename == "Name" && xmlreader.isStartElement())
                       {
                           while(!(nodename == "Name" && xmlreader.isEndElement()))
                           {
                               OutPut.append(QString("%1").arg(xmlreader.readElementText()));
                           }
                       }
                       else if(nodename == "Xcoordinate" && xmlreader.isStartElement())
                       {
                           while(!(nodename == "Xcoordinate" && xmlreader.isEndElement()))
                           {
                               OutPut.append(QString("%1").arg(xmlreader.readElementText()));
                           }
                       }
                       else if(nodename == "Ycoordinate" && xmlreader.isStartElement())
                       {
                           while(!(nodename == "Ycoordinate" && xmlreader.isEndElement()))
                           {
                               OutPut.append(QString("%1").arg(xmlreader.readElementText()));
                           }
                       }
                       else if(nodename == "Width" && xmlreader.isStartElement())
                       {
                           while(!(nodename == "Width" && xmlreader.isEndElement()))
                           {
                                OutPut.append(QString("%1").arg(xmlreader.readElementText()));
                           }
                       }
                       else if(nodename == "Height" && xmlreader.isStartElement())
                       {
                           while(!(nodename == "Height" && xmlreader.isEndElement()))
                           {
                                OutPut.append(QString("%1").arg(xmlreader.readElementText()));
                           }
                       }
                   }
               }
           }

           file.close();
           qDebug()<<"文件关闭"<<endl;

           qDebug()<<"xml文件读取完成"<<endl;
           return OutPut;
       }
}

3,在mainwindow里面绘制界面
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QPushButton>
namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

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

private:
    Ui::MainWindow *ui;

};

#endif // MAINWINDOW_H

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "config.h"
#include <QDebug>
#include <QCheckBox>
#include <qlistwidget.h>
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    config config;
    QStringList str;

    str = config.readConfig();
    for (int i = 0; i<str.count();i++)
    {
        qDebug()<<str.at(i)<<endl;
    }
    QPushButton *aa = new QPushButton(this);
    aa->setText(str.at(1));
    aa->setGeometry(str.at(5).toInt(),str.at(4).toInt(),str.at(2).toInt(),str.at(3).toInt());

}

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

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

五:运行结果
在这里插入图片描述
六:结语
这个并不是通用的,仅供参考,每个人都要自己写一个适合自己的祖传代码,这样以后复用性很高。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt通过读取XML文件,绘制图形界面 的相关文章

  • Android 键盘清单未显示在设置中

    我正在制作我的第一个 Android 应用程序 我需要它作为键盘服务 据我所知 清单看起来不错 并且我有一个文件 WifiJoy java 在 com zwad3 wifijoy 包中 以及所有其他文件
  • 用于冒号分隔标签的 XML 解析器? [关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • Qt 创建者 + MITK (Linux)

    我正在尝试使用MITK 与 Qt Creator 我已经通过 ccmake 成功编译并使用了 VTK 和 ITK 我已经编译了 MITK超级建造模式 它下载 CTK VTK ITK 等 然后我就配置好了 我已经用 make 编译了 大约两个
  • C# MonoGame 有帮助吗? (Content.Load("入侵者");)

    我正在 MonoGame 中使用 Open GL 制作太空入侵者游戏 并且尝试加载已添加到内容文件夹中的纹理 这是一个名为 Invader 的 PNG 文件 我使用的代码是 invader Content Load
  • 在 WSDL 中包含 XSD

    我正在编写一个 wsdl 文件来在未来 SoapUI 中部署模拟服务 但我在包含我的 xsd 文件时遇到问题 XSD File
  • 如何使用scrapy抓取xml url

    你好 我正在使用 scrapy 来抓取 xml url 假设下面是我的 Spider py 代码 class TestSpider BaseSpider name test allowed domains www example com s
  • 允许 .NET WebApi 忽略 DOCTYPE 声明

    我正在尝试通过 WebApi 方法将 XML 反序列化为对象 我有以下课程 XmlRoot IsNullable false public class MyObject XmlElement Name public string Name
  • & 在 xml 文件中算作一个还是多个字符?

    我正在使用的 XML 模式具有特定的字符串字符长度 所以我可能有一个类似的字符串 Jim Mary 在 C 中是 10 个字符 但是当它写入 xml 时 它会变成 Jim amp Mary 如果 XML 模式规定字符串最多只能有 10 个字
  • 在 XSD 中哪里放置版权信息?

    将版权信息放入 XML 架构定义 XSD 时 是否有官方 或半官方 普遍接受的 位置 基于在哪里将版本添加到 XSD 架构 https stackoverflow com questions 2138705 where to add a v
  • 如何使用 Webpack 加载器导入 XML,而不自动转换为 JSON

    Webpack 4 的 xml loader 自动将导入的 XML 文件转换为 JSON 通过什么方式可以导入XMLwithout转换为 JSON XML 数据将使用现有的 应用程序专用的 XML 解析器进行处理 明确地说 我绝对愿意not
  • 如何创建用于 QML 的通用对象模型?

    我想知道是否有任何宏或方法如何将 Qt 模型注册为 QObject 的属性 例如 我有AnimalModel http doc qt io qt 5 qtquick modelviewsdata cppmodels html qabstra
  • 具有挑战性的问题 - 使用 PHP 对 XML 数据进行排序

    我有 xml 文件 其中包含大量产品数据 我需要根据我的字段 ProductRange 的数据对我的产品进行排序 ProductRange urldecode GET Range XML 文件数据
  • 使用批处理解析 XML 文件以从某些特定节点获取值

    对于每个节点列表有Lists作为其父节点 我想获取 保存前三个节点的变量值 即entry output and token 我知道如何使用 vbscript 来做到这一点 但对我来说 批量解决方案更有趣 请问可以做吗
  • VBA XML V6.0 如何让它等待页面加载?

    我一直在努力寻找答案 但似乎找不到任何有用的东西 基本上 我是从一个网站上拉取的 当您在该页面上时 该网站会加载更多项目 我希望我的代码在加载完成后提取最终数据 但不知道如何让 XML httprequest 等待 Edited Sub p
  • 在python中读取PASCAL VOC注释

    我在 xml 文件中有注释 例如这个 它遵循 PASCAL VOC 约定
  • 更改 Windows Phone 系统托盘颜色

    有没有办法将 Windows Phone 上的系统托盘颜色从黑色更改为白色 我的应用程序有白色背景 所以我希望系统托盘也是白色的 您可以在页面 XAML 中执行此操作
  • Qt 布局,在小部件大小更改后调整到最小大小

    基本上我有一个QGridLayout里面有一些小部件 最重要的是 2 个标签 我用它们将图像绘制到屏幕上 好吧 如果用户愿意 他可以更改传入图像的分辨率 从而强制标签调整大小 我们假设标签的初始大小是320x240 用户将 VideoMod
  • 通过 XML 将重复事件添加到 Google 日历

    我正在尝试通过协议 API 将重复事件添加到我的日历中 我从在 Google 界面中创建的事件中获取了重复标记的语法 并将其用于我的创建请求中 这是我提交的内容
  • 根据属性值使用 xslt 合并两个元素

    这是我的源文件的样子
  • JSPX 命名空间对于 EL 函数不可见?

    我正在尝试使用 JSPX JSP 的纯 XML 语法 并遇到看起来应该可以工作但实际上却不起作用的情况 我使用 jsp root 元素中的命名空间声明导入标签库 然后稍后将这些用于元素以及 EL 函数

随机推荐

  • unity 模型销毁_Unity3D常用 API 之实例化与销毁

    1 实例化游戏物体 1 1 游戏中的案例介绍 在很多 MMORPG 类的游戏中都有类似于 金钱副本 的副本关卡 在这类副 本中通常都是限定一个时间 在这个时间内玩家可以尽情的破坏 然后收集金钱 分析游戏截图讲解场景元素 见图 场景中所有的坛
  • latex 如何添加圆圈数字?

    众所周知 LATEX 提供了 textcircled 命令用以给字符加圈 但效果却不怎么好 实际上 加圈并不是一个平凡的变换 它会涉及到圈内字符形状的微调 而这是几乎无法在 TEX 宏层面解决的 因此 要得到比较好的效果 最好能使用预先设计
  • iwebsec靶场 文件包含漏洞通关笔记9-file://伪协议利用

    目录 前言 1 file协议 2 利用条件 1 file 用于访问本地文件系统 2 file 必须是绝对路径 第09关 file 伪协议利用 1 打开靶场 2 源码分析 3 获取 etc passwd渗透 前言 1 file协议 file协
  • QCQI学习笔记(1)

    Chapter I II overview of the quantum information probabilistic model qubit tensor product dirac notation Chapter III Sup
  • electron-上传文件,下载csv txt xlsx

    electron 主进程 渲染进程 在vue中调用接口 相互通信 csv txt 上传csv文件 将csv文件读取内容 iconv lite 解决读取内容乱码 xlsx 上传xlsx文件 xlsx文件内容读取 下载xslx文件 简单无样式的
  • 虚析构函数

    自动调用基类部分的析构函数对基类的设计有重要影响 删除指向动态分配对象的指针时 需要运行析构函数 在释放对象的内存之前清除对象 处理继承层次中的对象时 指针的静态类型可能与被删除对象的动态类型不同 可能会删除 实际指向派生类对象的基类类型指
  • Android 10 修改系统默认的字体大小

    代码路径 frameworks base core java android content res Configuration java frameworks base packages SettingsProvider res valu
  • 美团外卖智能陪伴型导购的探索与实践

    相比于其他电商场景 外卖场景对于实时发现和反馈用户兴趣的能力有着更高的要求 近年来 美团外卖算法团队摸索出了一套适用于外卖场景的智能陪伴型导购架构和策略 这一举措已经取得了显著成效 本文将详细介绍外卖搜索技术团队搭建智能陪伴型导购时 所遇到
  • 浅析深究什么是中间件

    本文发布于2009年10月30日 1 由来 因为工作的原因 我从金蝶集团调入金蝶中间件公司工作以来 经常遇到一个问题就是中间件公司是个什么公司 中间件是什么 金蝶不是做ERP的吗 怎么也做中间件 这是我以前在金蝶集团时无法想象的问题 因为金
  • R语言笔记四

    str function str Compacktly display the internal structure of an R object A diagnostic function and an alternative to su
  • AndroidUI库集合

    https hndeveloper github io 2017 github android ui html 进度条 https github com Vension V AndroidCollectSources
  • 双指针和递归

    一 双指针 1 给你一个n 给你n个数 再给一个val 去掉所有等于val的值 思路 当i和j位置都是非val值 i j 当i位置是val j 当i是val j是非val 交换 i j 当j走到最后一个位置的时候 停了 输出0 i位置的值
  • 量化术语速查表(持续更新)

    本文介绍一些量化投资相关术语 帮助大家更好地了解该行业 作者 bigquant 阅读时间 15分钟 本文由BigQuant宽客学院推出 难度标签 以下术语没有先后顺序 并将持续更新 金融相关 股票 股份公司发行的所有权凭证 债券 承诺按一定
  • GDB+Jlink调试注意事项

    1 在汇编调用C的一步要用 Step in 不要用 Step Over 因为main对于汇编来说只是一个函数 会造成程序全速运行 不能单步调试 对于汇编代码 Step in Step Over 是一样的效果 所以在进行main函数之前最好都
  • 表白代码大全_隐藏表白系列都在这里了

    点击上方 搞siao君 右上角找到 立刻设置我为 星标 置顶 每天第一时间推送给你 每天都有不一样的精彩 喜欢就多多分享哦 一 微信隐藏表白代码大全 爱你我爱你我爱你我爱你我爱你我爱你我
  • List与ArrayList的区别

    在刷题的时候发现ArrayList初始化时 有下面两种情况 List
  • 2023五大自动化测试的 Python 框架

    自2018年被评选为编程语言以来 Python在各大排行榜上一直都是名列前茅 目前 它在Tiobe指数中排名第三个 仅次于Java和C 随着该编程语言的广泛使用 基于Python的自动化测试框架也应运而生 且不断发展与丰富 因此 开发与测试
  • Nacos和Zookeeper对比

    主要平时用的较多是配置中心和服务注册中心 所以也是结合这两点功能做出对应的对比 主要比对集群模式 以下仅仅整理了个人理解后的观点 如有疑问欢迎咨询讨论 1 Zookeeper 其实明白一点Zookeeper的功能主要是它的树形节点来实现的
  • GIT Please, commit your changes or stash them before you can merge. Aborting

    用git pull来更新代码的时候 遇到了下面的问题 C error Your local changes to the following files would be overwritten by merge xxx xxx xxx p
  • Qt通过读取XML文件,绘制图形界面

    最近需要实现通过读取xml文件的形式动态绘制界面的需求 这样会很方便 在外界修改xml文件就可以了 不需要重新编译程序 一 XML文件 XML的格式和一些说明 本文就不在介绍了 菜鸟教程有更清晰的入门介绍 菜鸟教程 XML 二 QT中读取X