QStyledItemDelegate類爲來自模型的數據項提供了顯示和編輯工具。框架 當在Qt項視圖(例如QTableView)中顯示來自模型的數據時,各個項由委託(delegate)繪製。此外,當編輯一個項目時,它提供一個編輯器小部件,當編輯發生時,該小部件放在項目視圖的頂部。QStyledItemDelegate是全部Qt項視圖的默認委託,在建立時安裝在它們上。 QStyledItemDelegate類是模型/視圖類之一,是Qt模型/視圖框架的一部分。委託容許獨立於模型和視圖開發項目的顯示和編輯。編輯器 項目的數據在模型中被分配一個ItemDataRole;每一個項目能夠爲每一個角色存儲QVariant。QStyledItemDelegate實現顯示和編輯用戶所指望的最多見的數據類型,包括布爾值、整數、字符串。根據數據在模型中所扮演的角色,數據的繪製將會有所不一樣。一般須要確保模型爲每一個角色返回適當的數據,以肯定視圖中的項的外觀。ide |
這裏有如下幾個要點要記住:函數
1.QStyledItemDelegate是專門用於項的(item)的視圖委託!不能做爲其餘非項的委託使用。工具
2.委託用於實現個性化設置的項顯示,他的數據來源於模型(model),控制view顯示的方式。性能
3.QStyledItemDelegate是做爲默認項委託使用的。若是不獨立實現並制定項的委託,則在自定義view和自定義的model中使用默認的委託(delegate)。字體
4.使用默認委託時,從模型中讀取的數據都是按照默認規則來的。默認規則就是經過itemDataRole角色標誌的數據在view中顯示的。所以須要在model中未每一個定義的角色返回合適的數據,這樣在使用默認委託時才能顯示出本身想要的效果。固然,若是想要其餘個性化效果最好是使用自定義的委託。優化
模型中角色可接受的數據類型
這裏注意一下幾點:spa
1.角色的數據大多數在默認委託中有專門的用途(在view中什麼以model的什麼數據呈現)rest
2.對於Qt::EditRole咱們要特別注意,編輯器是懸浮在item上的一個特別的可編輯按鈕,他不屬於view視圖自己:
編輯器是用QItemEditorFactory建立的;QItemEditorFactory提供的默認靜態實例安裝在全部項委託上。您可使用setItemEditorFactory()設置自定義工廠,或者使用QItemEditorFactory::setDefaultFactory()設置一個新的默認工廠。使用編輯的EditRole存儲在項目模型中的數據。請參閱QItemEditorFactory類,瞭解項目編輯器工廠的更高級介紹。 |
使用QStyledItemDelegate的子類實現自定義項的委託
若是委託不支持繪製所需的數據類型,或者但願定製項目的繪製,則須要子類化QStyledItemDelegate,並從新實現paint()和sizeHint()。paint()函數爲每一個項目分別調用,使用sizeHint(),能夠爲每一個項目指定提示。
當從新實現paint()時,一般會處理要繪製的數據類型,並對其餘類型使用超類實現(通常使用QStyledItemDelegate)。
複選框指示符的繪製按當前樣式執行。樣式還指定用於繪製不一樣數據角色的數據的大小和邊框。項目自己的邊框也由樣式計算。當繪製已經支持的數據類型時,最好詢問這些邊框的樣式。QStyle類描述更詳細地描述了這一點。
若是您但願更改按樣式或複選框指示符繪製的任何邊框,您能夠對QStyle進行子類化。可是,請注意,從新實現sizeHint()也會影響項目的大小。
自定義委託能夠在不使用編輯器項目工廠的狀況下提供編輯器。在這種狀況下,必須從新實現如下虛擬功能:
createEditor()返回用於從模型中更改數據的小部件,並能夠從新實現以自定義編輯行爲。 |
注意:從Qt 4.4開始,有兩個委託類:QItemDelegate和QStyledItemDelegate。可是,默認的委託是QStyledItemDelegate。這兩個類是繪製和爲視圖中的項目提供編輯器的獨立替代。它們之間的區別在於,QStyledItemDelegate使用當前樣式來繪製其項目。所以,咱們建議在實現自定義委託或使用Qt樣式表時使用QStyledItemDelegate做爲基類。這兩個類所需的代碼應該是相等的,除非自定義委託須要使用繪圖的樣式。若是您但願定製項目視圖的繪畫,您應該實現自定義樣式。即QStyle類。
下面就一般須要覆寫的方法進行說明
void QStyledItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const;
從新實現從QAbstractItemDelegate:paint()。使用給定的painter和style選項爲索引指定的項呈現委託。這個函數使用視圖的QStyle繪製項。在子類中從新實現繪製時。使用initStyleOption()以與QStyledItemDelegate相同的方式設置該選項。只要有可能,在繪畫的時候使用這個選項。特別是它的rect變量決定在何處繪製和它的狀態,以肯定是否啓用或選擇了它。paint繪畫完成後,你應該確保paint回到使用前的狀態。例如,在繪製以前調用QPainter::save(),而後調用QPainter: restore()。
注意:
1.QPainter類:QPainter提供了高度優化的函數來完成大多數GUI繪圖程序所需的工做。它能夠畫出從簡單的線條到複雜的形狀,好比派和和絃。它還能夠繪製對齊的文本和像素地圖。一般,它畫一個「天然」的座標系統,但它也能夠作視圖和世界變換。QPainter能夠對任何繼承QPaintDevice類的對象進行操做。QPainter的常見用法是在小部件的繪圖事件中:構造和定製(例如,設置鋼筆或畫筆)。而後畫。記住在畫完後要毀掉QPainter對象。
2.QStyleOptionViewItem類:QStyleOptionViewItem類用於描述用於在視圖小部件中繪製項的參數。 QStyleOptionViewItem包含QStyle函數繪製Qt模型/視圖類項所需的全部信息。因爲性能緣由,對成員變量的訪問是直接的(即。,使用。或- >操做符,都定義爲public公有類型)。這種低級的感受使結構易於使用,並強調這些只是樣式函數使用的參數。
3.QModelIndex類:QModelIndex類用於定位數據模型中的數據。這個類被用做從QAbstractItemModel派生的項目模型的索引。項視圖、委託和選擇模型使用索引來定位模型中的項。
QStyleOptionViewItem類公有區域屬性的說明
QModelIndex類的說明
QModelIndex類用於定位數據模型中的數據。這個類被用做從QAbstractItemModel派生的項目模型的索引。項視圖、委託和選擇模型使用索引來定位模型中的項。新的QModelIndex對象由模型使用QAbstractItemModel::createIndex()函數建立。可使用QModelIndex構造函數構造無效的模型索引。當引用模型中的頂級項時,無效索引一般用做父索引。
模型索引引用模型中的項目,幷包含在這些模型中指定它們的位置所需的全部信息。每一個索引位於給定的行和列中,而且可能具備父索引;使用row()、列()和父()來獲取這些信息。模型中的每一個頂級項都由沒有父索引的模型索引表示——在本狀況下:parent()將返回一個無效的模型索引,至關於使用QModelIndex()構造函數的零參數形式構造的索引。
爲了得到一個模型索引,它引用模型中的現有項目,調用QAbstractItemModel::索引(),其中包含所需的行和列值,以及父類的模型索引。當在模型中引用頂級項時,供應QModelIndex()做爲父索引。
注意:應該當即使用模型索引,而後丟棄。在調用修改模型結構的模型函數或刪除項以後,不該該依賴索引來保持有效。若是須要長期保持模型索引,請使用QPersistentModelIndex。