♥ 學習筆記Learning 程式語言 Coding

[程式] QT各式GUI介面解析-Item Based vs. Model Based

再經過幾天閱讀了大量的QT文件與規格以後,蕾咪的任務正式起跑了。

第一個任務是要加速目前已經實作好的介面,去修改一些策略,讓資料庫的存取可以更有效率;之後的任務就要開始獨立實作兩個控制軟體,為了具體的了解每一種元件在QT的意義與效能,做了一篇小小的整理,就當作是自己的學習筆記這樣!>W<

QT中的item view有兩種類型。
1. item based ,以widget為結尾。
2.model based,以view為結尾。

 

1. item-based widget

優點:使用起來最簡單,同時具有以下三種特性。
(1) 儲存資料的容器 Data Container
(2) 顯示資料 Presentation
(3) 使用者互動 User Action

缺點:處理大量資料會感到力不從心,因為在顯示之前會全部複製過來。
改進:使用Virtual List/Grid,使得不把所有資料複製過來,僅僅顯示哪筆就取哪筆資料。
→這種方式稱為Delay Fetch,可能問題是實作不好的,使用者快速存取時,會拖慢使用速度甚至看不到資料。

 

2. model-based view

對應的種類:
(1) QListView
(2) QTreeView
(3) QTableView

# 與item-based widget的主要差別:
Widget是小部件,View是大的顯示區間。

 

# 前置概念:MVC 設計模式(Model/View/Controller)

(1) Model :沒有儲存真正的資料或是只儲存少數資料,資料主要是從資料庫(database/disk file)所得到;主要的功能就是提供資料給View,然後將使用者對View的修改傳給真正的資料。因此,讀寫文件、控制資料、網路通訊等資料是Model的工作。如果資料量大的話,Model還會給予資料Model Index作為編號用途。通常編號的方式是二維的,如果是多層結構,則會再加上parent index做為第三層的編號。

(2) View:多個View可以同時存取同一塊資料;當View 需要顯示數據的話,藉由之前在Model編好的Model index透過Model存取(Model data→data changed signal→update view);當然View也可以進行修改(model setData()→model index)。Model的資料使用QVarient 類別來紀錄;可以分為多個角色(Role),Qt::DisplayRole用來顯示,Qt::BackgroundRole用來處理背景,而View在這裡可以做一點對資料的加工,並且在下一步Delegate真正的顯示。

(3) Controller:Delegate屬於Controller,當View使喚他:) 顯示時,他會在Paint乖乖顯示;當使用者觸發了View的editTrigger,View會執行beginEditing;Delegate會在某處建立一個Widget(Line Edit或Combo box)處理使用者的輸入,使用者輸入後,Delegate得到輸入後返回(return),這些輸入可以透過呼叫Model的setData儲存在真正的資料庫裡,由此而知,Delegate只負責最後的顯示與使用者互動的。

談到使用者互動(User Action),就必須來談談Selection Model。
View 將Item Index儲存進Selection model中,並根據其內容來顯示。
由於多個View可以共用一個Selection Model,因此,選中一個時,另一個View中的對應Item也會被選中。

針對Qt model/view framework來說,主要是以C++的虛擬類別和虛擬函數的特性為基礎。
MVC之間彼此的連結主要是利用Signal/Slot之外,剩下的就是虛擬函數。

無論是哪一種View,最終目的都是顯示出數據。
重新思考整個資料流向的兩條主線。
第一條主線:讓資料透過View顯示
第二條主線:修改資料後,如何讓資料庫更新。

# 性質

優點:靈活度夠,model/view/delegate皆可以繼承。
缺點:無法快速掌握,大部分的工程師選擇根據具體情況重新撰寫類別。


本文摘自QT社群,蕾咪重新紀錄是為了幫助自己理解囉!^^
原文連結:http://blog.csdn.net/superjoel/article/details/5112120

About the author

蕾咪

蕾咪,來自台東,卻不定期旅居歐洲的工程師女孩,身兼作家、部落客、創業家等多重身份。畢業於台大電子所,曾在義大利商與美商擔任研發工程師;走訪世界後,發現對台灣有段割捨不了的愛,讓我們一起努力成為想要的自己吧!:) 合作邀稿請聯繫:[email protected]

Leave a Comment