Qt-自定义代理

        在模型/视图结构中,代理的作用就是在视图组件进入编辑状态编辑某个项时,提供一个临时的编辑器用于数据编辑,编辑完成后再把数据提交给数据模型,例如,在QTableView组件上双击一个单元格时,代理会提供一个临时的编辑器,默认是QLineEdit编辑框,在这个编辑框里修改项的文字,按Enter键或者焦点移动到其他单元格时完成编辑,编辑框内的文字会保存到数据模型,当我想要改变默认的代理时,就需要自己自定义代理。

自定义代理的功能

        若要替换默认代理组件,就需要为QTableView组件的某列或者某个单元格设置自定义代理,自定义代理需要从QStyledItemDelegate类继承,创建自定义代理类的实例后,再将其设置为整个视图组件或者视图组件的某行某列的代理,以替代默认代理的功能。

QAbstractItemView 类定义了设置自定义代理类的3个函数,函数定义如下:

void setItemDelegate(QAbstractItemDelegate* delegate)

void setItemDelegateForColumn(int column,QAbstractItemDelegate* delegate)

void setItemDelegateForRow(int Row,QAbstractItemDelegate* delegate)

        其中,delegate是创建的自定义代理类的实例对象。函数setItemDelegate()将delegate设置为整个视图组件的代理,函数setItemDelegateForColumn()为视图组件的某一列设置自定义代理,函数setItemDelegateForRow()为视图组件的某一行设置自定义代理,QStyledItemDelegate是视图组件使用的默认的代理类,自定义代理类需要从QStyledItemDelegate列继承

QStyledItemDelegate类

        QStyledItemDelegate是视图组件使用的默认的代理类,一般使用QStyledItemDelegate作为自定义代理类的父类,要自定义一个代理类,必须重新实现QStyledItemDelegate中定义的4个虚函数,这4个函数是由模型/视图系统自动调用的

1,函数createEditor()

        函数createEditor()可创建用于编辑模型数据的界面组件,被称为代理编辑器,例如QSpinBox组件,或QComboBox组件,其函数原型定义如下

QWidget* QStyledItemDelegate::createEditor(QWidget* parent,const QStyleOptionViewItem &option,const QModelIndex &index)

        其中parent是要创建的组件的父组件,一般就是窗口对象,option是项的一些显示选项,是QStyleOptionViewItem类型的,包含字体,对齐方式,背景色等属性,index是项在数据模型中的模型索引,通过index->model()可以获取项所属数据模型的对象指针。在QTableView视图组件上双击一个单元格使其进入编辑状态时,系统就会自动调用createEditor()创建代理编辑器

2,函数setEditorData()

        函数setEditorData()的功能是从数据模型获取某一个项的角色(一般是EditRole 角色)数据,然后将其设置为代理编辑器上显示的数据,其函数原型如下

void QStyledItemDelegate::setEditorData (QWidegt* editor , const QModelIndex &index)

        参数editor就是前面用函数createEditor()创建的代理编辑器,通过index->model()可以获取项所属数据模型的对象指针,从而获取项的数据,然后将其显示在代理编辑器上。

3,函数setModelData()

        完成对当前单元格的编辑,例如输入焦点到其他单元格时,系统会自动调用函数setModelData(),其功能是将代理编辑器里的输入数据保存到数据模型的项里,其函数原型定义如下

void QStyledItemDelegate::setModelData(QWidget* editor,QAbstractItemModel &model,const QModelIndex &index)

        其中editor是代理编辑器,model是数据模型,index是所编辑的项在模型中的模型索引。

4,函数updateEditorGepmetry()

        视图组件在界面上显示代理编辑器时,需要调用updateEditorGepmetry()函数为组件设置合适的大小,其函数原型定义如下

void QStyledItemDelegate::updateEditorGepmetry(QWidget* editor,const  QStyleOptionViewItem &option,const QModelIndex &index)

        其中变量option->rect是QRect类型,表示代理编辑器的建议大小,一般将代理编辑器大小设置为建议大小即可,即用下面的一行代码,

void setGeometry(option,rect);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值