Qt Model View 學習筆記 五

2021-05-11 10:12:26 字數 2735 閱讀 2873

view 類

概念

在model/view架構中,view從model中獲得資料項然後顯示給使用者。資料顯示的方式不必與model提供的表示方式相同,可以與底層儲存資料項的資料結構完全不同。

內容與顯式的分離是通過由qabstractitemmodel提供的標準模型介面,由qasbstractitemview提供的標準檢視介面共同實現的。普遍使用model index來表示資料項。view負責管理從model中讀取的資料的外觀布局。

它們自己可以去渲染每個資料項,也可以利用delegate來既處理渲染又進行編輯。

除了顯示資料,views也處理資料項的導航,參與有關於資料項選擇的部分功能。view也實現一些基本的使用者介面特性,如上下文選單與拖拽功能。view也為資料項提供了預設的程式設計功能,也可搭配delegate實現更為特殊的定製編輯的需求。

乙個view建立時並不需要model,但在它能顯示一些真正有用的資訊之前,必須提供乙個model。view通過使用

selections來跟蹤使用者選擇的資料項。每個view可以維護單獨使用的selections,也可以在多個views之間共享。有些views,如qtableview和qtreeview,除資料項之外也可顯示標題(headers),標題部分通過乙個view來實現,qheaderview。標題與view一樣總是從相同的model中獲取資料。從 model中獲取資料的函式是qabstractitemmodel::headerdate(),一般總是以表單的形式中顯示標題資訊。可以從qheaderview子類化,以實現更為複雜的定製化需求。

使用現成的view

qt提供了三個現成的view 類,它們能夠以使用者熟悉的方式顯示model中的資料。qlistview把model中的資料項以乙個簡單的列表的形式顯示,或是以經典的圖示檢視的形式顯示。qtreeview把model中的資料項作為具有層次結構的列表的形式顯示,它允許以緊湊的深度巢狀的結構進行顯示。qtableview卻是把model中的資料項以**的形式展現,更像是乙個電子**應用程式的外觀布局。

以上這些標準view的行為足以應付大多數的應用程式,它們也提供了一些基本的編輯功能,也可以定製特殊的需求。

使用model

// unindented for quoting purposes:

qstringlist numbers;

numbers << "one" << "two" << "three" << "four" << "five";

qabstractitemmodel *model = new stringlistmodel(numbers);

//要注意的是,這裡把stringlistmodel作為乙個qabstractitemmodel來使用。這樣我們就可以

//使用model中的抽象介面,而且如果將來我們用別的model代替了當前這個model,這些**也會照樣工作。

//qlistview提供的列表檢視足以滿足當前這個model的需要了。

為多個views提供相同的model是非常簡單的事情,只要為每個view設定相同的model。

qtableview *firsttableview = new qtableview;

qtableview *secondtableview = new qtableview;

firsttableview->setmodel(model);

secondtableview->setmodel(model);

在model/view架構中訊號、槽機制的使用意味著model中發生的改變會傳遞中聯結的所有view中,這保證了

不管我們使用哪個view,訪問的都是同樣的乙份資料。

上面的圖展示了乙個model上的兩個不同的views,儘管在不同的view中顯示的model中的資料是一致的,每個

view都維護它們自己的內部選擇模型,但有時候在某些情況下,共享乙個選擇模型也是合理的。

處理資料項的選擇

view中資料項選擇機制由qitemselectionmodel類提供。所有標準的view預設都構建它們自己的選擇模型,

以標準的方式與它們互動。選擇模型可以用selectionmodel()函式取得,替代的選擇模型也可以通過

setselectionmodel()來設定。當我們想在乙個model上提供多個一致的views時,這種對選擇模型的控制能力非常有用。通常來講,除非你子類化乙個model或view,你不必直接操縱selections的內容。

多個views之間共享選擇

接著上邊的例子,我們可以這樣:

secondtableview->setselectionmodel(firsttableview->selectionmodel());

現在所有views都在同樣的選擇模型上操作,資料與選擇項都保持同步。

上面的例子中,兩個view的型別是相同的,假如這兩個view型別不同,那麼所選擇的資料項在每個view

中的表現形式會有很大的不同。例如,在乙個table view中乙個連續的選擇,在乙個tree view中表現出

來的可能會是幾個高亮的資料項片斷的組合。

Qt Model View 學習筆記 五

view 類 概念 在model view架構中,view從model中獲得資料項然後顯示給使用者。資料顯示的方式不必與model提供的表示方式相同,可以與底層儲存資料項的資料結構完全不同。內容與顯式的分離是通過由qabstractitemmodel 提供的標準模型介面,由qasbstractite...

Qt Model View 學習筆記 四

qt model view 學習筆記 2010 06 28 12 42 03 閱讀38 字型大小 大中小 訂閱建立新的models 介紹 model view元件之間功能的分離,允許建立model利用現成的views。這也可以使用標準的功能 圖形使用者介面元件像qlistview,qtablevie...

Qt Model View 學習筆記 六

在views中選擇資料項 概念 qtableview table new qtableview 0 table setmodel model qitemselectionmodel selectionmodel table selectionmodel qmodelindex topleft qmo...