新闻中心

EEPW首页 > 汽车电子 > 设计应用 > QT平台下基于XML的界面设计与管理(下)

QT平台下基于XML的界面设计与管理(下)

作者:​周珊珊 刘高高时间:2017-02-24来源:电子产品世界收藏

接上篇
3 界面的实现与管理
图1(103页)所示为基于xml生成界面的大体流程,由 于本文选用pugixml库进行操作,因此在配置、加载以及修 改界面元素时均使用pugixml库的基本操作方法,下面详细 介绍。
3.1 使用pugixml库配置
本文使用pugixml库进行参数配置。具体方法如下:首 先对pugixml进行配置,pugixml的三个文件,可以只include 头文件pugixml.hpp,CPP文件不用放到项目中,方法是, 在pugiconfig.hpp中:#define PUGI_HEADER_ONLY和
#include "pugixml.cpp",将这两行的注释去掉即可。另外,如 果项目使用的是Unicode设置,则可以在pugicon句g.hpp中:
#define PUGI_WCHAR_MODE将wchar模式打开即 可。
对 界 面 进 行 参 数 配 置 , 即 x m l 节 点 读 取 , 如 x m l 文 件

本文引用地址:http://www.eepw.com.cn/article/201702/344434.htm

图5   修改参数配置

params.xml:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<!-- 输入参数配置 -->
<form ip="10.2.134.243" port="80" action="sisserver.php">
<input name="data_type" value="POI" />
<input name="query_type" value="TQUERY" />
<input name="category" value="" />
3.2 使用pugixml库加载
pugixml提供几个函数用于从不同地方加载xml数据。 这 些 函 数 使 用 超 快 非 验 证 的 解 析 器 , 这 个 解 析 器 不 完 全 遵 照W3C标准,它可以加载任何有效的XML文档,但没有执 行某些well-formedness检查。虽然已经很努力来排除无效 的XML文档,但为了性能的原因有些验证没有完全执行。 一些XML转换(例如: EOL处理或属性值标准化)将导致解 析 速 度 下 降 , 因 此 不 进 行 这 些 验 证 。 对 于 绝 大 多 数 X M L 文档的不同解析选项, 并不存在性能上的差异。 pug i x ml 支 持 当 前 流 行 的 U n i c o d e
编 码 ( U T F- 8 , U T F- 1 6 ( 大 小 端 ) , U T F - 3 2 ( 大 端 ) , UCS-2也自然支持,因为它 是UTF-16的子集)并自动处 理 所 有 编 码 转 换 。 加 载 函
数通过检查XML数据的头部分自动进行编码检测。
1)从文件加载文档 多数XML文档来自文件,pugixml提供专门的函数从文
件加载XML文档,如下:
xml_parse_result xml_document::load_句le(const char* path,unsigned int options = parse_default, xml_encoding encoding =
encoding_auto);
xml_parse_result xml_document::load_file(const wchar_t*
path, unsigned int options = parse_default, xml_encoding encoding
= encoding_auto);
这些函数接受文件路径作为第一个参数,包括两个可 选参数,一个用于指定解析选项,另一个指定输入数据的编 码类型。
2)从内存加载
从内存中加载文档,首先需要为XML数据提供一个连 续的内存块;然后调用缓冲区加载函数,如果需要,这些函数将处理编码转换,然后解析数据为XML文档树。
3)从C++ IO流加载
为 了 加 强 交 互 性 , p u g i x m l 提 供 了 从 任 何 实 现 c + + std::istream接口的对象中加载文档。这允许你从任何c++流 (例如文件流)或任何第三方实现(例如boost Iostream)中加载 文档。
具体来说,使用pugixml加载文件,方法是:
首先,加载xml文件,使用xml_document类的load_句le接 口:
std::strFile = "../test.xml";
pugi::xml_document doc;
if (!doc.load_句le(strFile.c_str()))
{//return -1;}
其次,加载xml格式的字符串,使用xml_document类的
load接口:
std::strText = "****";
pugi::xml_document doc;
if (!doc.load(strText.c_str()))
{//return -1;}
图2、3(104页)为本文所讨论平台构建软件下,对其
XML文件的参数配置,图4(104页)为生成的树形结构界面。
3.3 使用pugixml库查询及修改
在XML描述界面信息的基础上,用XML的查询技术如 XQuery,XPath等进行模型信息的查询,可将之前系统开发 获得的界面信息用XML文件的形式存储起来,并且可以组 织形成一个界面信息库。对于界面信息的查询,可以分别从 名称、描述信息、XML文档中定义的元素和属性等关键字 进行查询,将此查询到的界面描述信息经过修改和扩展就可以加入到新工程的设计开发
中,从而可以大大提高开发 效率。
1)查询:pugixml提供
一 些 方 法 用 于 从 文 档 中 获 取 不 同 类 型 的 数 据 和 遍 历 文 档 。 除 了 X Pat h 相 关 的 函 数,其它方法都没有修改文 档 , 。 其 中 有 两 种 类 型 的 树 数据句柄, x ml_node和x ml_ attribute;

图6    修改后生成界面
2)修改:可以通过pugixml提供的函数修改文档结构或
修改节点、属性的数据,这些函数负责管理内存和结构的完 整性,因此操作之后总能保持树结构的有效性。然而,也有 可能创建一个无效的XML树(例如,添加两个相同名字的属 性或设置属性/节点的名字为无效的字符串)。对于属性的修 改,内存消耗和性能都是经过优化的,如果你有足够的内 存从头开始创建文档,稍后在保存它们到文件比起手写xml 文本没有太大的开销。所有改变节点/属性数据或结构的成 员函数都是非const的,因此不能在const类型的句柄上调用 它们。然后你可以轻易地转换const型句柄到非const型,仅 需要一个赋值操作,例如void foo(const pugi::xml_node& n) { pugi::xml_node nc = n; },因为常量的准确性在这里主要提供 作为参考文档而已。
图5、6为将XML参数修改之后的参数配置及其重新生 成的界面,和图2、3、4进行对比,可以看出,我们 将“设 备1”-“设备5”的名称变更为“设备更新1”-“设备更新
5”,在界面有新的显示,以此类推,通过访问XML文件实 现对界面的管理。

4 结束语
本文讨论的平台下利用XML技术进行界面的设计和 管理,主要利用pugixml库进行XML文件的具体操作,最终 成功生成界面。因此证明,基于XML 的用户界面管理系统 为软件开发提供了有效且有力的支持,通过该系统不仅可以 使用户界面描述信息与功能实现代码相分离,简化用户界面 的开发与维护,提高界面的开发效率,还可以使软件的最终 用户获得与开发人员相同的界面操控能力,在系统运行前和
运行过程中对用户界面进行配置和管理等操作。



关键词: QT XML

评论


相关推荐

技术专区

关闭