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