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