Qt C++程序設(shè)計 課件 chap11 MVC_第1頁
Qt C++程序設(shè)計 課件 chap11 MVC_第2頁
Qt C++程序設(shè)計 課件 chap11 MVC_第3頁
Qt C++程序設(shè)計 課件 chap11 MVC_第4頁
Qt C++程序設(shè)計 課件 chap11 MVC_第5頁
已閱讀5頁,還剩37頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

QtC++第十一章Model/View結(jié)構(gòu)主要提要41Model/View結(jié)構(gòu)介紹Delegate類2Model類及其創(chuàng)建3View類及其創(chuàng)建Model/View案例Model/View結(jié)構(gòu)提供了一種清晰的數(shù)據(jù)管理方式,促進了信息的透明化,能夠更加關(guān)注用戶體驗和可訪問性。在學(xué)習(xí)Model/View結(jié)構(gòu)時,需要分析和評估不同模型與視圖的設(shè)計選擇,在實踐中探索新的數(shù)據(jù)展示方式和交互設(shè)計,在技術(shù)實現(xiàn)中不斷嘗試新想法,推動技術(shù)進步。在Model/View架構(gòu)中,需要關(guān)注用戶的心理與情感需求,設(shè)計出更加人性化的界面和交互方式。例如,使用溫暖的色調(diào)和友好的提示信息,可以有效提升用戶的心理舒適度。Model/View結(jié)構(gòu)的學(xué)習(xí)中意識到技術(shù)的快速變化和更新,養(yǎng)成終身學(xué)習(xí)意識。在技術(shù)日新月異的今天,持續(xù)學(xué)習(xí)新技術(shù)和新方法是每個技術(shù)人員的必備能力。學(xué)習(xí)和思考一.Model/View架構(gòu)有時,我們的系統(tǒng)需要顯示大量數(shù)據(jù),比如從數(shù)據(jù)庫中讀取數(shù)據(jù),以自己的方式顯示在自己的應(yīng)用程序的界面中?早期的Qt實現(xiàn):需要定義一個組件,在這個組件中保存一個數(shù)據(jù)對象,比如一個列表。那在一個大型系統(tǒng)中呢?Smalltalk語言發(fā)明了一種嶄新的實現(xiàn),用來解決這個問題,這就是著名的MVC模型。MVC是Model-View-Controller的簡寫,即模型-視圖-控制器。MVC由三種對象組成。Model是應(yīng)用程序?qū)ο?,View是它的屏幕表示,Controller定義了用戶界面如何對用戶輸入進行響應(yīng)。10.1Model/View結(jié)構(gòu)一.Model/View架構(gòu)在MVC中,模型負責(zé)獲取需要顯示的數(shù)據(jù),并且存儲這些數(shù)據(jù)的修改,向上提供一個相同的API。視圖用于將模型數(shù)據(jù)顯示給用戶。對于數(shù)量很大的數(shù)據(jù),或許只顯示一小部分,這樣就能很好的提高性能。控制器是模型和視圖之間的媒介,將用戶的動作解析成對數(shù)據(jù)的操作,比如查找數(shù)據(jù)或者修改數(shù)據(jù),然后轉(zhuǎn)發(fā)給模型執(zhí)行,最后再將模型中需要被顯示的數(shù)據(jù)直接轉(zhuǎn)發(fā)給視圖進行顯示。MVC的核心思想是分層,不同的層應(yīng)用不同的功能。Qt中ItemViews中提供五個項目視圖控件分別為QListView、QTreeView、QTableView、QColumnView和UndoView。11.1Model/View結(jié)構(gòu)一.Model/View架構(gòu)Qt4開始,引入了類似的model/view架構(gòu)來處理數(shù)據(jù)和面向最終用戶的顯示之間的關(guān)系。當(dāng)MVC的V和C結(jié)合在一起,就得到了model/view架構(gòu)。這種架構(gòu)依然將數(shù)據(jù)和界面分離,但是框架更為簡單。同樣,這種架構(gòu)也允許使用不同界面顯示同一數(shù)據(jù),也能夠在不改變數(shù)據(jù)的情況下添加新的顯示界面。為了處理用戶輸入,還引入了委托(delegate)。引入委托的好處是,能夠自定義數(shù)據(jù)項的渲染和編輯。11.1Model/View結(jié)構(gòu)一.Model/View架構(gòu)總之,model/view架構(gòu)將傳統(tǒng)的MV模型分為三部分:模型、視圖和委托。每一個組件都由一個抽象類定義,這個抽象類提供了基本的公共接口以及一些默認(rèn)實現(xiàn)。模型、視圖和委托則使用信號槽進行交互:來自模型的信號通知視圖,其底層維護的數(shù)據(jù)發(fā)生了改變;來自視圖的信號提供了有關(guān)用戶與界面進行交互的信息;來自委托的信號在用戶編輯數(shù)據(jù)項時使用,用于告知模型和視圖編輯器的狀態(tài)。11.1Model/View結(jié)構(gòu)主要提要41Model/View結(jié)構(gòu)介紹Delegate類2Model類及其創(chuàng)建3View類及其創(chuàng)建在model/view構(gòu)架中,model為view和delegates使用數(shù)據(jù)提供了標(biāo)準(zhǔn)接口。模型并不存儲數(shù)據(jù)本身。這意味著,可以將數(shù)據(jù)存儲在一個數(shù)據(jù)結(jié)構(gòu)中、另外的類中、文件中、數(shù)據(jù)庫中,或者其他應(yīng)用程序的控件中。InterView框架中的所有模型都基于抽象基類QAbstractItemModel類,此類由QAbstractListModel、QAbstractTableModel、QAbstractProxyModel等類繼承。QAbstractItemModel提供的接口足夠靈活,足以應(yīng)付以表格、列表和樹的形式顯示的數(shù)據(jù)。一.Model類11.2Model類及其應(yīng)用Qt內(nèi)置了許多標(biāo)準(zhǔn)模型:QStringListModel:存儲簡單的字符串列表。QStandardItemModel:可以用于樹結(jié)構(gòu)的存儲,提供了層次數(shù)據(jù)。QFileSystemModel:本地系統(tǒng)的文件和目錄信息。QSqlQueryModel、QSqlTableModel和SqlRelationalTableModel:存取數(shù)據(jù)庫數(shù)據(jù)。如果這些標(biāo)準(zhǔn)模型不能滿足需要時,就需要繼承QAbstractItemModel、QAbstractListModel或者QAbstractTableModel,創(chuàng)建自己的模型類。一.Model類11.2Model類及其應(yīng)用Qt模型類繼承關(guān)系一.Model類11.2Model類及其應(yīng)用Qt提供的兩個標(biāo)準(zhǔn)的models:QStandardItemModel和QDirModel。QStandardItemModel是一個多用途的model,可用于表示list,table,treeviews所需要的各種不同的數(shù)據(jù)結(jié)構(gòu)。QDirModel維護相關(guān)的目錄內(nèi)容的信息,它本身不持有數(shù)據(jù),僅是對本地文件系統(tǒng)中的文件與目錄的描述。QDirModel是一個現(xiàn)成的model,很容易進行配置以用于現(xiàn)存的數(shù)據(jù),使用這個model,可以很好地展示如何給一個現(xiàn)成的view設(shè)定model,研究如何用modelindexes來操縱數(shù)據(jù)。一.Model類11.2Model類及其應(yīng)用Qt內(nèi)置標(biāo)準(zhǔn)模型的應(yīng)用(1)QStringListModel二.Model類應(yīng)用舉例11.2Model類及其應(yīng)用QStringListModel*listModel=newQStringListModel;//定義初始化一個字符串列表模型QStringList

monthList;//定義要給字符串列表monthList<<"一月"<<"二月"<<"三月"<<"四月"<<"五月"<<"六月"<<"七月"<<"八月"<<"九月"<<"十月"<<"十一月"<<"十二月";//字符串列表初始化值listModel->setStringList(monthList);//字符串列表模型中設(shè)置字符串列表數(shù)據(jù)ui->listView->setModel(listModel);//在列表視圖中設(shè)置列表模型ui->comboBox_List->addItems(monthList);//在組合框中添加字符串列表數(shù)據(jù)項Qt內(nèi)置標(biāo)準(zhǔn)模型的應(yīng)用(2)QFileSystemModel和QDirModelQFileSystemMode提供了一個可用于訪問本機文件系統(tǒng)的數(shù)據(jù)模型,需要用setRootPath()函數(shù)為QFileSystemModel設(shè)置一個根目錄。QDirModel的功能與QFileSystemModel類似,也可以獲取目錄和文件。二.Model類應(yīng)用舉例11.2Model類及其應(yīng)用QFileSystemModel*fileSystemModel=newQFileSystemModel;//定義初始化一個文件系統(tǒng)模型QDirModel*dirModel=newQDirModel;//定義初始化一個目錄模型fileSystemModel->setRootPath(QDir::currentPath());//設(shè)置文件系統(tǒng)模型的根目錄為當(dāng)前路徑ui->treeView_fileSysModel->setModel(fileSystemModel);//將文件系統(tǒng)模型添加到樹形視圖中dirModel->index(QDir::currentPath());//設(shè)置目錄模型的索引為當(dāng)前路徑ui->treeView_2->setModel(dirModel);//將目錄模型添加到樹形視圖中二.Model類應(yīng)用舉例1、QAabstractItemModel的子類會以層次結(jié)構(gòu)的形式來表示數(shù)據(jù),結(jié)構(gòu)中包含了數(shù)據(jù)項表。比如常用的QListModel、QTableModel和QTreeModel模型如圖:三.Model類的概念11.2Model類及其應(yīng)用2、modelindex:為了使數(shù)據(jù)存儲與數(shù)據(jù)訪問分開,引入了modelindex的概念。通過modelindex,可以引用model中的數(shù)據(jù)項,Views和delegates都使用indexes來訪問數(shù)據(jù)項,然后再顯示出來。QAbstractItemModel*model=index.model();

modelindexes提供了對一項數(shù)據(jù)信息的臨時引用,通過它可以訪問或是修改model中的數(shù)據(jù)。在獲取對應(yīng)一個數(shù)據(jù)項的modelindex時,需要考慮有關(guān)于model的三個屬性:行數(shù),列數(shù),父項的modelindex。三.Model類的概念11.2Model類及其應(yīng)用2、modelindex:model中的行列數(shù)來獲取任一項數(shù)據(jù),可以得到與數(shù)據(jù)項一一對應(yīng)的那個index。QModelIndexindex=model->index(row,column,...);訪問表表中數(shù)據(jù):通過行列數(shù),可以獲取代表一個數(shù)據(jù)項的modelindexQModelIndex

indexA=model->index(0,0,QModelIndex());

QModelIndex

indexB=model->index(1,1,QModelIndex());

QModelIndex

indexC=model->index(2,1,QModelIndex());一個model的頂級項,由QModelIndex()取得,它們上式被用作父項。

三.Model類的概念11.2Model類及其應(yīng)用3、父項:每個數(shù)據(jù)項可能是別的項的父項,上級的項可以獲取下級項的列表。當(dāng)獲取model中數(shù)據(jù)項的index時,必須指定關(guān)于數(shù)據(jù)項的父項的信息。在model外部,引用一個數(shù)據(jù)項的唯一方法就是通過modelindex,因此需要在求取modelindex時指定父項的信息。

QModelIndexindex=model->index(row,column,parent);三.Model類的概念11.2Model類及其應(yīng)用3、父項:三.Model類的概念11.2Model類及其應(yīng)用圖中,A項和C項作為model中頂層的兄弟項:

QModelIndexindexA=model->index(0,0,QModelIndex());

QModelIndexindexC=model->index(2,1,QModelIndex());A有許多孩子,它的一個孩子B用以下代碼獲?。?/p>

QModelIndexindexB=model->index(1,0,indexA);

4、項角色:model中的項可以作為各種角色來使用,這允許為不同的環(huán)境提供不同的數(shù)據(jù)。舉例來說,Qt::DisplayRole被用于訪問一個字符串,它作為文本會在view中顯示。每個數(shù)據(jù)項都可以為許多不同的角色提供數(shù)據(jù),標(biāo)準(zhǔn)的角色在Qt::ItemDataRole中定義,如:Qt::DisplayRole:文本表格中要渲染的關(guān)鍵數(shù)據(jù)

Qt::EditRole:編輯器中正在編輯的數(shù)據(jù)

Qt::ToolTipRole:數(shù)據(jù)項的工具提示的顯示數(shù)據(jù)

Qt::WhatsThisRole:項為"What'sThis?"模式顯示的數(shù)據(jù)角色指出了從model中引用哪種類型的數(shù)據(jù)。views可以用不同的形式顯示角色,因此為每個角色提供正確的信息是非常重要的。三.Model類的概念11.2Model類及其應(yīng)用使用模型索引ModelIndexes11.2Model類及其應(yīng)用//由該模型使用index()的特定實現(xiàn)來獲取父索引QModelIndex

parentIndex=dirModel->index(QDir::currentPath());intnumberRows=dirModel->rowCount(parentIndex);//使用rowCount()函數(shù)來計算行號//依次獲取每一行中的第一個項目的模型索引,以及讀出所存儲在該模型項目中的數(shù)據(jù)。for(introw=0;row<numberRows;++row){QModelIndexindex=dirModel->index(row,0,parentIndex);QStringtext=dirModel->data(index,Qt::DisplayRole).toString();ui->textEdit->append(text);QModelIndexindex2=dirModel->index(row,1,parentIndex);

QStringtext2=dirModel->data(index2,Qt::DisplayRole).toString();

ui->textEdit->append(text2);使用模型QAstractItemModel構(gòu)建自己的模型11.2Model類及其應(yīng)用使用模型創(chuàng)建一個字符串列表模型作為例子,設(shè)置一些數(shù)據(jù),并構(gòu)造一個視圖來顯示模型的內(nèi)容。一個模型的多個視圖使用11.2Model類及其應(yīng)用Model對應(yīng)多個視圖一個模型的多個視圖使用11.2Model類及其應(yīng)用創(chuàng)建兩個表視圖,使用的均是創(chuàng)建好的同一個模型。11.3View類及其應(yīng)用在model/view架構(gòu)中,view從model中獲得數(shù)據(jù)項然后顯示給用戶。View既可以通過直接調(diào)用model提供的API來取得數(shù)據(jù),也可以通過delegate編輯后取得數(shù)據(jù),然后在不同的view顯示數(shù)據(jù)。數(shù)據(jù)顯示的方式不必與model提供的表示方式相同,可以與底層存儲數(shù)據(jù)項的數(shù)據(jù)結(jié)構(gòu)完全不同。內(nèi)容與顯式的分離是通過由QAbstractItemModel提供的標(biāo)準(zhǔn)模型接口,由QAsbstractItemview提供的標(biāo)準(zhǔn)視圖接口共同實現(xiàn)的。關(guān)于在view被選擇的數(shù)據(jù)項的信息保持在QItemSelectionModel類的實例中。

一.View類的概念I(lǐng)nterView框架中的所有視圖都基于抽象基類QAbstractItemView類,此類由QListView、QTableViewQTreeViewQColumnView和UndoView等類繼承。QListView把model中的數(shù)據(jù)項以一個簡單的列表的形式顯示,或是以經(jīng)典的圖標(biāo)視圖的形式顯示。QTreeView把model中的數(shù)據(jù)項作為具有層次結(jié)構(gòu)的列表的形式顯示,它允許以緊湊的深度嵌套的結(jié)構(gòu)進行顯示。QTableView卻是把model中的數(shù)據(jù)項以表格的形式展現(xiàn),更像是一個電子表格應(yīng)用程序的外觀布局。QColumnView提供了一個多級的視圖(每點開一個選項都會在它旁邊出現(xiàn)一個菜單,顯示它所有的子項目)。11.3View類及其應(yīng)用一.View類的概念11.3View類及其應(yīng)用一.View類的概念Qt視圖類繼承關(guān)系11.3View類及其應(yīng)用二.View類的應(yīng)用View通過model接口訪問數(shù)據(jù),以QListView方式顯示11.3View類及其應(yīng)用二.View類的應(yīng)用View通過model接口訪問數(shù)據(jù),以QTableView方式顯示:二.View類的應(yīng)用View通過model接口訪問數(shù)據(jù),以QTreeView方式顯示11.3View類及其應(yīng)用11.3View類及其應(yīng)用

三.

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論