13.5 委托(Delegates)(2)
类SpinBoxDelegate的实现如代码段13 20所示。其成员函数createEditor()创建一个编辑器,类型为QModelIndex的函数参数是将被编辑的数据项的索引。一般情况下,该函数应该读取目标数据项中角色EditorRole对应的数据子项,并依据这个数据子项的类型决定创建什么类型的编辑器。对于本例,由于所有数据项都是数值类型,该函数无须访问目标数据项,总是返回一个能够编辑数值的QSpinBox对象。
代码段13 20,类SpinBoxDelegate的实现,取自z:\examples\mvc\spinboxdelegate\delegate.cpp
- QWidget *SpinBoxDelegate::createEditor(QWidget *parent, const QStyleOptionViewItem &/* option */,
- const QModelIndex &/* index */) const
- {
- QSpinBox *editor = new QSpinBox(parent);
- editor->setMinimum(0);
- editor->setMaximum(100);
- return editor;
- }
- void SpinBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const
- {
- int value = index.model()->data(index, Qt::EditRole).toInt();
- QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
- spinBox->setValue(value);
- }
- void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model,
- const QModelIndex &index) const
- {
- QSpinBox *spinBox = static_cast<QSpinBox*>(editor);
- spinBox->interpretText();
- int value = spinBox->value();
- model->setData(index, value, Qt::EditRole);
- }
- void SpinBoxDelegate::updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option,
- const QModelIndex &/* index */) const
- {
- editor->setGeometry(option.rect); ①
- }
如前文所述,成员函数setEditorData()读取目标数据项的数据,初始化编辑器,而成员函数setModelData()读取编辑器中的值,将其写回目标数据项中。当用单击并拖曳图13 19中两列标头之间的分隔线时,可以更改数据项的外观尺寸。视图对象会将被编辑数据项的尺寸信息封装在QStyleOptionViewItem中,通知委托对象更改与这个数据项关联的编辑器的外观尺寸。代码段13 20中的成员函数updateEditorGeometry()将被调用。行①令编辑器占据目标数据项所占的整个区域。