第62课 模型视图中的委托(下)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第62课 模型视图中的委托(下)相关的知识,希望对你有一定的参考价值。
1. 委托的本质
(1)为视图提供数据编辑的上下文环境
(2)产生界面元素的工厂类
(3)能够使用和设置模型中的数据
2. 自定义委托类
(1)自定义委托类的继承关系
(2)自定义委托时需要重写的函数
①createEditor
②updateEditorGeometry
③setEditorData
④setModelData
⑤paint(可选)
(3)自定义委托时重写的函数由谁调用?
由于模型视图设计模式,视图中组合了委托对象,既然委托存在于视图内部,就应该由视图来调用(可从上图的函数调用栈中看到这一点)。
3. 重写函数的伪代码
(1)重写createEditor成员函数
//根据索引中值的类型创建编辑器组件 QWidget* createEditor(/*parameter*/) const { QWidget* ret = NULL; if(index.data().type() == QVariant::Bool){ /* create check box */ }else if(){ /* create combo box */ }else { /*default*/ } return ret; }
(2)重写updateEditorGeometry成员函数
//根据参数中数据项的信息设置编辑器的位置和大小 void updateEditorGeometry(QWidget* editor, const QStyleOptionViewItem& option, const QModelIndex& index) const { editor->setGeometry(option.rect); }
(3)重写setEditorData成员函数
//根据参数中的数据索引设置编辑器中的初始数据 void setEditorData(QWidget* editor, const QModelIndex& index) const { if( index.data().type() == QVariant::Bool ){ QCheckBox* cb = dynamic_cast<QCheckBox*>(editor); /* set data to editor */ }else if( index.data().type() == QVariant::Char){ QCombobox* cb = dynamic_cast<QCombobox*>(editor); /* set data to editor */ }else{ QItemDelegate::setEditorData(editor, index); } }
(4)重写setModelData成员函数
//根据参数中的数据索引更改模型中的数据 void setModelData(QWidget* editor, QAbstractItemModel* model, const QModelIndex& index) const { if (index.data().type() == QVariant::Bool){ QCheckBox* cb = dynamic_cast<QCheckBox*>(editor); /* set data to model from editor */ }else if(index.data().type() == QVariant::Char){ QCombobox* cb = dynamic_cast<QCombobox*>(editor); /* set data to model from editor */ }else{ /* default action from parent class */ } }
(5)重写paint成员函数(可选)
//根据参数中的信息绘制编辑器 void paint(QPainter* painter, const QStyledOptionViewItem& option, const QModelIndex& index) const { if(/* condition */) { /* customized paint action */ }else{ QItemDelegate::paint(painter, option, index); } }
【编程实验】自定义委托
//main.cpp
//Widget.h
//Widget.cpp
// CustomizedItemDelegate.h
// CustomizedItemDelegate.cpp
4. 小结
(1)自定义委托类时需要重写相应的成员函数
(2)根据需要创建编辑组件并设置组件中的数据
(3)编辑结束后将数据返回模型
(4)成员函数的参数携带了数据存取时需要的信息
以上是关于第62课 模型视图中的委托(下)的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 jquery 从 asp.net 视图模型中动态删除行而不删除集合中的其余下一个对象