首页 > 代码库 > 第62课 模型视图中的委托(下)
第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课 模型视图中的委托(下)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。