目錄
一、子類化委托
二、委托方法實現
1)createEditor
2)setEditorData
3)setModelData
4)updateEditorGeometry
三、委托使用
四、總結
Qt的數據容器控件采用模型/視圖(model/view)架構設計。模型用于存放控件的數據,視圖則用于顯示編輯數據,而委托則是用于實現自定義視圖的一種方式。比如我們在QTableWidget表格控件中想要使用combox控件來編輯數據,就需要使用到委托功能。對于委托,通俗一點理解就是將需要實現的一些功能交由其他對象來承擔。本文以QTableWidget控件為例,對Qt中委托的使用進行簡要介紹。
一、子類化委托
QT中常用的委托類有兩個,分別是QItemDelegate和QStyledItemDelegate,官方建議優先使用QStyledItemDelegate。官方解釋是它們之間的區別在于QStyledItemDelegate使用當前樣式來繪制其項目。因此,建議在實現自定義委托或使用Qt樣式表時使用QStyledItemDelegate作為基類,除非自定義委托需要使用繪圖樣式。一般情況下,我們就直接使用QStyledItemDelegate類。類的繼承實現頭文件如下。默認情況下,至少需要重寫createEditor、setEditorData、setModelData、updateEditorGeometry這4個函數。
類的頭文件中定義了一個私有成員names,用于存放傳遞給QCombox控件的項目參數,并同時定義了一個公有函數,用于設置names的值。在規范的類定義中,一般不將類的成員變量或屬性值設置為公有的,為了體現類的封裝性,對類成員的賦值和取值都使用方法來實現。同時在最后還定義了一個信號haveSetSignal,用于返回需要往外傳遞的參數。
#ifndef CUSTOMSTYLEDITEMDELEGATE_H
#define CUSTOMSTYLEDITEMDELEGATE_H#include <QObject>
#include <QStyledItemDelegate>
#include <QComboBox>
#include <QCheckBox>
#include <QApplication>class CustomStyledItemDelegate:public QStyledItemDelegate
{Q_OBJECTprivate:QStringList names;
public:void setNames(QStringList);explicit CustomStyledItemDelegate(QObject *parent = nullptr);QWidget * createEditor( QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index ) const override;void setEditorData( QWidget * editor, const QModelIndex & index