柚子快報(bào)邀請(qǐng)碼778899分享:開(kāi)發(fā)語(yǔ)言 Qt-自定義代理
? ? ? ? 在模型/視圖結(jié)構(gòu)中,代理的作用就是在視圖組件進(jìn)入編輯狀態(tài)編輯某個(gè)項(xiàng)時(shí),提供一個(gè)臨時(shí)的編輯器用于數(shù)據(jù)編輯,編輯完成后再把數(shù)據(jù)提交給數(shù)據(jù)模型,例如,在QTableView組件上雙擊一個(gè)單元格時(shí),代理會(huì)提供一個(gè)臨時(shí)的編輯器,默認(rèn)是QLineEdit編輯框,在這個(gè)編輯框里修改項(xiàng)的文字,按Enter鍵或者焦點(diǎn)移動(dòng)到其他單元格時(shí)完成編輯,編輯框內(nèi)的文字會(huì)保存到數(shù)據(jù)模型,當(dāng)我想要改變默認(rèn)的代理時(shí),就需要自己自定義代理。
自定義代理的功能
? ? ? ? 若要替換默認(rèn)代理組件,就需要為QTableView組件的某列或者某個(gè)單元格設(shè)置自定義代理,自定義代理需要從QStyledItemDelegate類繼承,創(chuàng)建自定義代理類的實(shí)例后,再將其設(shè)置為整個(gè)視圖組件或者視圖組件的某行某列的代理,以替代默認(rèn)代理的功能。
QAbstractItemView 類定義了設(shè)置自定義代理類的3個(gè)函數(shù),函數(shù)定義如下:
void setItemDelegate(QAbstractItemDelegate* delegate)
void setItemDelegateForColumn(int column,QAbstractItemDelegate* delegate)
void setItemDelegateForRow(int Row,QAbstractItemDelegate* delegate)
? ? ? ? 其中,delegate是創(chuàng)建的自定義代理類的實(shí)例對(duì)象。函數(shù)setItemDelegate()將delegate設(shè)置為整個(gè)視圖組件的代理,函數(shù)setItemDelegateForColumn()為視圖組件的某一列設(shè)置自定義代理,函數(shù)setItemDelegateForRow()為視圖組件的某一行設(shè)置自定義代理,QStyledItemDelegate是視圖組件使用的默認(rèn)的代理類,自定義代理類需要從QStyledItemDelegate列繼承
QStyledItemDelegate類
????????QStyledItemDelegate是視圖組件使用的默認(rèn)的代理類,一般使用QStyledItemDelegate作為自定義代理類的父類,要自定義一個(gè)代理類,必須重新實(shí)現(xiàn)QStyledItemDelegate中定義的4個(gè)虛函數(shù),這4個(gè)函數(shù)是由模型/視圖系統(tǒng)自動(dòng)調(diào)用的
1,函數(shù)createEditor()
????????函數(shù)createEditor()可創(chuàng)建用于編輯模型數(shù)據(jù)的界面組件,被稱為代理編輯器,例如QSpinBox組件,或QComboBox組件,其函數(shù)原型定義如下
QWidget* QStyledItemDelegate::createEditor(QWidget* parent,const QStyleOptionViewItem &option,const QModelIndex &index)
? ? ? ? 其中parent是要?jiǎng)?chuàng)建的組件的父組件,一般就是窗口對(duì)象,option是項(xiàng)的一些顯示選項(xiàng),是QStyleOptionViewItem類型的,包含字體,對(duì)齊方式,背景色等屬性,index是項(xiàng)在數(shù)據(jù)模型中的模型索引,通過(guò)index->model()可以獲取項(xiàng)所屬數(shù)據(jù)模型的對(duì)象指針。在QTableView視圖組件上雙擊一個(gè)單元格使其進(jìn)入編輯狀態(tài)時(shí),系統(tǒng)就會(huì)自動(dòng)調(diào)用createEditor()創(chuàng)建代理編輯器
2,函數(shù)setEditorData()
? ? ? ? 函數(shù)setEditorData()的功能是從數(shù)據(jù)模型獲取某一個(gè)項(xiàng)的角色(一般是EditRole 角色)數(shù)據(jù),然后將其設(shè)置為代理編輯器上顯示的數(shù)據(jù),其函數(shù)原型如下
void QStyledItemDelegate::setEditorData (QWidegt* editor , const QModelIndex &index)
? ? ? ? 參數(shù)editor就是前面用函數(shù)createEditor()創(chuàng)建的代理編輯器,通過(guò)index->model()可以獲取項(xiàng)所屬數(shù)據(jù)模型的對(duì)象指針,從而獲取項(xiàng)的數(shù)據(jù),然后將其顯示在代理編輯器上。
3,函數(shù)setModelData()
? ? ? ? 完成對(duì)當(dāng)前單元格的編輯,例如輸入焦點(diǎn)到其他單元格時(shí),系統(tǒng)會(huì)自動(dòng)調(diào)用函數(shù)setModelData(),其功能是將代理編輯器里的輸入數(shù)據(jù)保存到數(shù)據(jù)模型的項(xiàng)里,其函數(shù)原型定義如下
void QStyledItemDelegate::setModelData(QWidget* editor,QAbstractItemModel &model,const QModelIndex &index)
? ? ? ? 其中editor是代理編輯器,model是數(shù)據(jù)模型,index是所編輯的項(xiàng)在模型中的模型索引。
4,函數(shù)updateEditorGepmetry()
????????視圖組件在界面上顯示代理編輯器時(shí),需要調(diào)用updateEditorGepmetry()函數(shù)為組件設(shè)置合適的大小,其函數(shù)原型定義如下
void QStyledItemDelegate::updateEditorGepmetry(QWidget* editor,const? QStyleOptionViewItem &option,const QModelIndex &index)
? ? ? ? 其中變量option->rect是QRect類型,表示代理編輯器的建議大小,一般將代理編輯器大小設(shè)置為建議大小即可,即用下面的一行代碼,
void setGeometry(option,rect);
柚子快報(bào)邀請(qǐng)碼778899分享:開(kāi)發(fā)語(yǔ)言 Qt-自定義代理
相關(guān)鏈接
本文內(nèi)容根據(jù)網(wǎng)絡(luò)資料整理,出于傳遞更多信息之目的,不代表金鑰匙跨境贊同其觀點(diǎn)和立場(chǎng)。
轉(zhuǎn)載請(qǐng)注明,如有侵權(quán),聯(lián)系刪除。