QT平臺(tái)下基于XML的界面設(shè)計(jì)與管理(下)
接上篇
3 界面的實(shí)現(xiàn)與管理
圖1(103頁(yè))所示為基于xml生成界面的大體流程,由 于本文選用pugixml庫(kù)進(jìn)行操作,因此在配置、加載以及修 改界面元素時(shí)均使用pugixml庫(kù)的基本操作方法,下面詳細(xì) 介紹。
3.1 使用pugixml庫(kù)配置
本文使用pugixml庫(kù)進(jìn)行參數(shù)配置。具體方法如下:首 先對(duì)pugixml進(jìn)行配置,pugixml的三個(gè)文件,可以只include 頭文件pugixml.hpp,CPP文件不用放到項(xiàng)目中,方法是, 在pugiconfig.hpp中:#define PUGIXML_HEADER_ONLY和
#include "pugixml.cpp",將這兩行的注釋去掉即可。另外,如 果項(xiàng)目使用的是Unicode設(shè)置,則可以在pugicon句g.hpp中:
#define PUGIXML_WCHAR_MODE將wchar模式打開(kāi)即 可。
對(duì) 界 面 進(jìn) 行 參 數(shù) 配 置 , 即 x m l 節(jié) 點(diǎn) 讀 取 , 如 x m l 文 件
圖5 修改XML參數(shù)配置
params.xml:
<?xml version="1.0" encoding="utf-8" ?>
<root>
<!-- 輸入?yún)?shù)配置 -->
<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庫(kù)加載
pugixml提供幾個(gè)函數(shù)用于從不同地方加載xml數(shù)據(jù)。 這 些 函 數(shù) 使 用 超 快 非 驗(yàn) 證 的 解 析 器 , 這 個(gè) 解 析 器 不 完 全 遵 照W3C標(biāo)準(zhǔn),它可以加載任何有效的XML文檔,但沒(méi)有執(zhí) 行某些well-formedness檢查。雖然已經(jīng)很努力來(lái)排除無(wú)效 的XML文檔,但為了性能的原因有些驗(yàn)證沒(méi)有完全執(zhí)行。 一些XML轉(zhuǎn)換(例如: EOL處理或?qū)傩灾禈?biāo)準(zhǔn)化)將導(dǎo)致解 析 速 度 下 降 , 因 此 不 進(jìn) 行 這 些 驗(yàn) 證 。 對(duì) 于 絕 大 多 數(shù) X M L 文檔的不同解析選項(xiàng), 并不存在性能上的差異。 pug i x ml 支 持 當(dāng) 前 流 行 的 U n i c o d e
編 碼 ( U T F- 8 , U T F- 1 6 ( 大 小 端 ) , U T F - 3 2 ( 大 端 ) , UCS-2也自然支持,因?yàn)樗?是UTF-16的子集)并自動(dòng)處 理 所 有 編 碼 轉(zhuǎn) 換 。 加 載 函
數(shù)通過(guò)檢查XML數(shù)據(jù)的頭部分自動(dòng)進(jìn)行編碼檢測(cè)。
1)從文件加載文檔 多數(shù)XML文檔來(lái)自文件,pugixml提供專門的函數(shù)從文
件加載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);
這些函數(shù)接受文件路徑作為第一個(gè)參數(shù),包括兩個(gè)可 選參數(shù),一個(gè)用于指定解析選項(xiàng),另一個(gè)指定輸入數(shù)據(jù)的編 碼類型。
2)從內(nèi)存加載
從內(nèi)存中加載文檔,首先需要為XML數(shù)據(jù)提供一個(gè)連 續(xù)的內(nèi)存塊;然后調(diào)用緩沖區(qū)加載函數(shù),如果需要,這些函數(shù)將處理編碼轉(zhuǎn)換,然后解析數(shù)據(jù)為XML文檔樹(shù)。
3)從C++ IO流加載
為 了 加 強(qiáng) 交 互 性 , p u g i x m l 提 供 了 從 任 何 實(shí) 現(xiàn) c + + std::istream接口的對(duì)象中加載文檔。這允許你從任何c++流 (例如文件流)或任何第三方實(shí)現(xiàn)(例如boost Iostream)中加載 文檔。
具體來(lái)說(shuō),使用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頁(yè))為本文所討論QT平臺(tái)構(gòu)建軟件下,對(duì)其
XML文件的參數(shù)配置,圖4(104頁(yè))為生成的樹(shù)形結(jié)構(gòu)界面。
3.3 使用pugixml庫(kù)查詢及修改
在XML描述界面信息的基礎(chǔ)上,用XML的查詢技術(shù)如 XQuery,XPath等進(jìn)行模型信息的查詢,可將之前系統(tǒng)開(kāi)發(fā) 獲得的界面信息用XML文件的形式存儲(chǔ)起來(lái),并且可以組 織形成一個(gè)界面信息庫(kù)。對(duì)于界面信息的查詢,可以分別從 名稱、描述信息、XML文檔中定義的元素和屬性等關(guān)鍵字 進(jìn)行查詢,將此查詢到的界面描述信息經(jīng)過(guò)修改和擴(kuò)展就可以加入到新工程的設(shè)計(jì)開(kāi)發(fā)
中,從而可以大大提高開(kāi)發(fā) 效率。
1)查詢:pugixml提供
一 些 方 法 用 于 從 文 檔 中 獲 取 不 同 類 型 的 數(shù) 據(jù) 和 遍 歷 文 檔 。 除 了 X Pat h 相 關(guān) 的 函 數(shù),其它方法都沒(méi)有修改文 檔 , 。 其 中 有 兩 種 類 型 的 樹(shù) 數(shù)據(jù)句柄, x ml_node和x ml_ attribute;
圖6 修改后生成界面
2)修改:可以通過(guò)pugixml提供的函數(shù)修改文檔結(jié)構(gòu)或
修改節(jié)點(diǎn)、屬性的數(shù)據(jù),這些函數(shù)負(fù)責(zé)管理內(nèi)存和結(jié)構(gòu)的完 整性,因此操作之后總能保持樹(shù)結(jié)構(gòu)的有效性。然而,也有 可能創(chuàng)建一個(gè)無(wú)效的XML樹(shù)(例如,添加兩個(gè)相同名字的屬 性或設(shè)置屬性/節(jié)點(diǎn)的名字為無(wú)效的字符串)。對(duì)于屬性的修 改,內(nèi)存消耗和性能都是經(jīng)過(guò)優(yōu)化的,如果你有足夠的內(nèi) 存從頭開(kāi)始創(chuàng)建文檔,稍后在保存它們到文件比起手寫(xiě)xml 文本沒(méi)有太大的開(kāi)銷。所有改變節(jié)點(diǎn)/屬性數(shù)據(jù)或結(jié)構(gòu)的成 員函數(shù)都是非const的,因此不能在const類型的句柄上調(diào)用 它們。然后你可以輕易地轉(zhuǎn)換const型句柄到非const型,僅 需要一個(gè)賦值操作,例如void foo(const pugi::xml_node& n) { pugi::xml_node nc = n; },因?yàn)槌A康臏?zhǔn)確性在這里主要提供 作為參考文檔而已。
圖5、6為將XML參數(shù)修改之后的參數(shù)配置及其重新生 成的界面,和圖2、3、4進(jìn)行對(duì)比,可以看出,我們 將“設(shè) 備1”-“設(shè)備5”的名稱變更為“設(shè)備更新1”-“設(shè)備更新
5”,在界面有新的顯示,以此類推,通過(guò)訪問(wèn)XML文件實(shí) 現(xiàn)對(duì)界面的管理。
4 結(jié)束語(yǔ)
本文討論的QT平臺(tái)下利用XML技術(shù)進(jìn)行界面的設(shè)計(jì)和 管理,主要利用pugixml庫(kù)進(jìn)行XML文件的具體操作,最終 成功生成界面。因此證明,基于XML 的用戶界面管理系統(tǒng) 為軟件開(kāi)發(fā)提供了有效且有力的支持,通過(guò)該系統(tǒng)不僅可以 使用戶界面描述信息與功能實(shí)現(xiàn)代碼相分離,簡(jiǎn)化用戶界面 的開(kāi)發(fā)與維護(hù),提高界面的開(kāi)發(fā)效率,還可以使軟件的最終 用戶獲得與開(kāi)發(fā)人員相同的界面操控能力,在系統(tǒng)運(yùn)行前和
運(yùn)行過(guò)程中對(duì)用戶界面進(jìn)行配置和管理等操作。
評(píng)論