1. 程式人生 > >用QT產生報告的一種方案

用QT產生報告的一種方案

------------------------------------------------------------------------------------------------
(1)有一個xml檔案作為報告的模板F,各種需要動態顯示的資料在模板中有唯一的標識,執行時可以根據這些標識來獲得實際資料R;  
(2)使用xml的庫,解析模板F,並根據標識填充實際的動態資料R,將得到的資料按照XML標準存到一個數據X中; (3)讀取資料X,產生符合要求的報告。 QT解析XML檔案的機制 -------------------------------------------------------------------------------------------------
使用三個類,分別是QXmlInputSource,QXmlReader和QXmlDefaultHandler,來完成XML檔案的解析。 QXmlInputSource,用於封裝待解析的XML檔案,為QXmlReader提供輸入資料。 QXmlReader是一個抽象類,提供介面,用來實現讀取xml檔案(即QXmlInputSource),並寫到你指定的地方。QXmlReader目前唯一的子類就是QSimpleReader。如果對要對xml檔案的內容感興趣進行處理,如將資料儲存到指定結構,就必須自己實現特定的處理類Handler,預設的有QXmlDefaultHandler,就是不作任何處理,你可以需要生成它的子類,加上自己的實現。
上面的過程可以寫成下面的程式碼:
// 生成xml source
QXmlInputSource * source = new QXmlInputSource(file);

// 定義reader,並設定handler
QXmlSimpleReader reader;
Handler *handler = new Handler;
reader.setContentHandler(handler);
reader.setErrorHandler(handler);

// 進行解析,此時解析之後的處理結果會根據handler程式獲得
reader.parse(source);


實現介紹 -------------------------------------------------------------------------------------------------
首先需要定義方案中提到的XML資料結構: QDomDocument doc("report"); QDomElement root = doc.createElement("report"); doc.appendChild(root);  這裡看到QDomElement就是一個XML資料結構了,這個變數非常重要,一方面模板解析出來並填充實際資料後,就將這些內容放入這個變數;另一方面,聲稱實際報告時,則需要從這個變數中去讀取資料。 然後使用QT機制(上面提到過的)來解析作為模板的xml檔案:
QXmlInputSource source(file); 
QXmlSimpleReader xmlReader;
ReportXmlParser xmlParser(root); // 這個物件派生於QXmlDefaultHander,實際解析和讀取資料的工作都要在它這裡完成,並將內容存入root中
xmlReader.setContentHandler(&xmlParser); // 通過這個函式,實際上將XML模板特定的解析工作交給了xmlParser,QXmlSimpleReader用來解析xml本身結構
xmlReader.setErrorHandler(&xmlParser);
xmlReader.parse(source);     // 進行解析

解析過程中,ReportXMlParser類,作為QXmlDefaultHander類的派生,應該負責獲得資料的資料,並更新到QDomElement變數root中去。 最後,讀取QDomElement變數root,生成使用者需要的報告。

相關推薦

QT產生報告方案

------------------------------------------------------------------------------------------------ (1)有一個xml檔案作為報告的模板F,各種需要動態顯示的資料在模板中有唯一的標識,執行時可以根據這些標識來獲得實際

poj 2409 Let it Bead 串由n個珠子組成的項鍊c顏色染,旋轉/翻轉算方案,問共有多少不同的染色方案

  #include <cstdio> const int mod=1000000007; int fun(int a,int n) {     if(n==1) return a%mod;     if(n==0) return 1;     long lon

java.lang.NoClassDefFoundError錯誤產生的原因及解決方案方案

NoClassDefFoundError 最近在使用 Redisson 框架實現分散式鎖的時候,在專案啟動之後,報錯: 類的定義沒有找到, 根本原因是 ClassNotFoundException , 但是在編譯的時候,並沒有報錯,執行本地的測試類來進行建立對應

多域名環境,頁面獲取url的方案

loadurl -i 頁面獲取url html 變量 ice content 一個 信息 因為系統是分布式部署的。而且有多個域名,所以常常涉及到獲取url的問題。這是系統框架層面須要提供的能力。否則每一個模塊都須要自己去想辦法獲取ip,就會非常混亂。上線也easy發生b

[golang]讓golang支援泛型程式設計的方案

本部落格原創博文版權所有 @[email protected] 僅供交流學習使用用於商業用途請聯絡原作者  轉載請註明出處:http://blog.sina.com.cn/a

利用Unity3D與Oculus實現機器情緒安撫師的方案

(一張最原始的Unity3D中音樂視覺化粒子海的圖,想象一下,如果這幅場景出現在虛擬裝置中,輔以根據音樂頻譜變化的色彩與悅動頻率,會是怎樣的效果呢?)     Unity3D有著非常完備的虛擬三維場景互動開發功能,以Oculus為代表的虛擬現實裝置又有著極強的視覺感染力,一副不錯的耳機可以產生身臨其境的聽覺

關於實現log4j2日誌脫敏的方案

情景 最近公司嚴格要求日誌脫敏,對於敏感欄位,諸如身份證號、手機號、銀行卡號等使用者資訊進行掩碼,保證日誌中沒有明文。 專案程式碼中列印日誌的地方形如: logger.info("idCard:{},phone:{},mobile:{},name:{}

實現VUE2.0中props資料雙向繫結的方案

問題描述 在vue2.0中,我們通過props方法來接受父元件所傳過來的值,但是這個過程是單項的,父元件可以改變傳給子元件的值,但是如果子元件想改變所接受的值並傳給父元件是不可以的,會報以下的錯誤。 該錯誤的意思的是:避免直接更改一個PROP,因為每當父元件重新呈現時

[Lua]實現switch的方案

Lua實現switch的一種方案 if ... elseif ... end 形式 local ET_CASE_ONE = 1 local ET_CASE_TWO = 2 local function do_case_one( ... ) print("do_case

Android客戶端和伺服器交換資料的方案

由於很多因素使得客戶端和伺服器之間互動的一些資料都要經過加密,為了方便,很多使用非對稱的加密演算法進行加密,其中RSA演算法成為首選。下面說說在Android客戶端怎中怎麼應用這種加密方案。 首先在我們Android客戶端啟動應用程式的時候,我們先請求一個伺服器,讓服務將R

Android 本地HTML螢幕適配的方案

前言:在Android開發中WebView載入網頁,網頁的適配應該是前端來處理的,畢竟客戶端的對網頁的控制是有限的。但是如果有一個本地的網頁而且該網頁的body是固定寬度的,讓我們去適配所有裝置還是比較頭疼的,當然這種應用場景是很罕見的,儘管如此我們還是討論

解決IOS在網頁搖搖會出現撤銷彈出框的方案帶音效的哈

問題:IOS在網頁中如果包含輸入框,比如輸入兌換碼正確後可以進行搖一搖,但是因為之前在輸入框中輸入過兌換碼,由於iphone有個很強大的功能就是搖一搖撤銷,這個功能可以在設定--通用--輔助功能--搖動以撤銷中關閉,但是不能讓每個使用者都在使用你的功能時去關閉,這樣體驗也太

利用memcached配置session一致性另外方案

紅色標註部分  upstream nginx { session_sticky cookie=uid fallback=on path=/ mode=insert option

約瑟夫環演算法面向物件的實現

首先介紹下約瑟夫環: 約瑟夫環是一個數學的應用問題:已知n個人(以編號1,2,3...n分別表示)圍坐在一張圓桌周圍。從編號為k的人開始報數,數到m的那個人出列;他的下一個人又從1開始報數,數到m的那個人又出列;依此規律重複下去,直到圓桌周圍的人全部出列。 下面就來個實際

實現資料邏輯刪除的方案

## 什麼是邏輯刪除 所謂邏輯刪除是指資料已經“不需要”了,但是並沒有使用delete語句將這些資料真實的從資料庫中刪除,而只是用一個標誌位將其設定為已經刪除。 ![](https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=3340871784

開箱即賊好的移動端適配方案

主角是誰 在今天這篇文章中,我並不會在這裡講一些移動端視口的概念,包括物理畫素和邏輯畫素,理想視口,dpr等等等等,我只介紹這樣一種非常不錯的移動端適配方案:post-css-to-viewport,如果我說這種方案能解決98%以上的移動端佈局痛點,我想整個部落格園,應該沒有人會反駁。 痛點在哪裡 在

淺析在QtWidget中自定義Model(beginInsertRows()和endInsertRows()是空架子,類似於信號,來通知底層)

cti ron 初學者 開發 http 沒有 insert ati 學習 Qt 4推出了一組新的item view類,它們使用model/view結構來管理數據與表示層的關系。這種結構帶來的功能上的分離給了開發人員更大的彈性來定制數據項的表示,它也提供一個標準的model接

Qt之自定義搜索框——QLineEdit裏增加一個Layout,還不影響正常輸入文字(好像是比較通吃的方法)

too 步驟 set box 文本 csdn sub void 鼠標 簡述 關於搜索框,大家都經常接觸。例如:瀏覽器搜索、Windows資源管理器搜索等。 當然,這些對於Qt實現來說毫無壓力,只要思路清晰,分分鐘搞定。 方案一:調用QLineEdit現

unity5打包機制下,資源打ab和資源管理的方案

remove 自己 return game tor 基礎 resource mea easyn unity5打包機制下,一種資源打ab和資源管理的方案。1.打ab:   1.設置平臺   2.清楚所有資源的assetbundlename:     string[] abN

Disruptor——可替代有界隊列完成並發線程間數據交換的高性能解決方案

top ogl align 來講 好處 文件 最優化 什麽 內存碎片   本文翻譯自LMAX關於Disruptor的論文,同時加上一些自己的理解和標註。Disruptor是一個高效的線程間交換數據的基礎組件,它使用柵欄(barrier)+序號(Sequencing)機制協