模型视图中的委托
-委托(Delegate)是视图中处理用户输入的部件
-视图可以设置委托对象用于处理用户输入
-委托对象负责创建和显示用户输入上下文
委托中的编辑器
-委托能够提供编辑时需要的上下文环境(编辑器)
-不同委托提供的编辑器类型不同(文本框,单选框,等)
-编辑器用从模型获取数据,并将编辑结果返回模型
委托中的关键函数
-createEditor
·需要编辑数据时,创建编辑器组件
-updataeEditorGeometry
·更新编辑器组件的大小
-setEditorData
·通过索引从模型中获取数据
-setModelData
·将编辑后的新数据返回
委托中的关键信号
-void closeEditor(QWidget *editor)
·编辑器组件关闭信号
void commitData(QWidget *editor)
·新数据提交信号
委托的本质
-为视图提供数据编辑的上下文环境
-产生界面元素的工厂类
-能够使用和设置模型中的数据
自定义委托时需要重写的函数
-createEditor
-updateEditorGeometry
-setEditorData
-setModeIData
-paint(可选)
重写creatorEditor成员函数
-根据索引中值的类型创建编辑器组件
QWdidget *creatorEditor( /* parameter */ )const
{
QWidget *ret = NULL;
if( index.data().type() == QVariant::Bool)
{
/* create check box */
}
else if(index.data().type() == QVariant::Char)
{
/* create combo box */
}
else
{
/* default */
}
return ret;
}
重写updateEditorGeometry成员函数
-根据参数中数据项的信息设置编辑器的位置和大小
void updateEditorGeometry(QWidget *editor,
const QStyaleOptionViewItem &option,const QModelIndex &index) const
{
editor->setGeometry(option.rect);
}
重写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);
}
else
{
QItemDelegate::setEditorData(editor,index);
}
}
重写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
{
/* dafault action from parent class */
}
}
重写paint成员函数(可选)
-根据参数中的信息绘制编辑器
void paint(QPainter *painter,
const QStyleOptionViewItem &option,
const QModelIndex &index) const
{
if( /* condition */ )
{
/* customized paint action */
}
else
{
QItemDelegate::paint(Painterr,option,index);
}
}
总结:
-自定委托类时需要重写相应的成员函数
-根据需要创建编辑组件并设置组件中的数据
-编辑结束后将数据返回模型
-成员函数的参数携带了数据存取时需要的信息