Qt Delgate的使用 簡單說明

 

(一) Qt Model/View 的簡單說明 、預約義模型架構

(二)使用預約義模型 QstringListModel例子編輯器

(三)使用預約義模型QDirModel的例子ide

(四)Qt實現自定義模型基於QAbstractTableModel函數

(五)Qt實現自定義模型基於QAbstractItemModel 工具

(六) Qt實現自定義委託 QDelegate 代理

Delegate  blog

概念 與MVC模式不一樣,model/view結構沒有用於與用戶交互的徹底獨立的組件。通常來說, view負責把數據展現給用戶,也處理用戶的輸入。爲了得到更多的靈性性,交互經過delegagte執行。它既提供輸入功能又負責渲染view中的每一個數據項。 
使用Delegate的緣由  Qt中當用到QTreeView和QTableView等用於顯示item的視圖時,你要編輯一個item用到的編輯工具多是除了默認文字編輯lineEdit之外的工具,例如button,spinBox,甚至Slider,ProgressBar,也有多是自定義的widget。因此Qt提供了一個委託類,用來處理View中的數據展現方式。繼承

Delegate類的繼承架構見下圖,get

 

        自從Qt4.4,出現了兩個delegate基類,QStyledItemDelegate vs. QItemDelegate。默認的delegate是QStyledItemDelegate,即你不本身寫delegate的時候,默認那個lineEdit是來自QStyledItemDelegate。Qt Assistant建議用戶若是自定義delegate或者用到了Qt style sheets的話,最好繼承自QStyledItemDelegate,爲何呢?首先這兩個類在繪製代理和爲item提供編輯器上面是獨立的,沒什麼聯繫,互不影響;不一樣的是QStyledItemDelegate使用當前style來繪製item(的代理),即若是程序設置了整體的風格(用QSS或其餘定義方式),QStyledItemDelegate會使用這個風格設置。string

先看看Qt Demos看了裏面spinboxDelegat的例子:
1. 自定義的delegate繼承自QItemDelegate。

2. 必須重載的一些函數:
       (1)  QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option,const QModelIndex &index) const;
       (2)  void setEditorData(QWidget *editor, const QModelIndex &index) const;
       (3)  void setModelData(QWidget *editor, QAbstractItemModel *model,const QModelIndex &index) const;
       (4)  void updateEditorGeometry(QWidget *editor,const QStyleOptionViewItem &option, const QModelIndex &index) const;

3. createEditor建立自定義widget並返回之。
        setEditorData是將model中當前有的數據設置到代理上。本身從model取出數據,本身setValue到editor上。
        setModelData是將editor上的數據保存到Model中。
        updateEditorGeometry就是將editor設置到必定位置,而且有必定大小,使這個editor看起來像是正好嵌入到格子裏面同樣。用的是option.rect。

4. closeEditor() signal 代表用戶完成編輯數據,編輯控件能夠銷燬。

5. commitData() signal 必須在完成編輯數據以後,發送該信號,將會把新數據寫回Model

6. paint() and sizeHint(), QitemDelegate默認繼承了該方法,若是須要特殊風格繪製單元項中內容,還需重載這兩個函數。

下面有三個例子能夠簡單的說明Qt中如何使用委託

 

例子1: SpinBoxDelegate,繼承於QItemDelegate

 

例子2:trackeditor,繼承於QItemDelegate

 

例子3: 繼承於 QStyledItemDelegate

相關文章
相關標籤/搜索