设为首页 加入收藏

TOP

13.5 委托(Delegates)(2)
2013-10-07 15:19:28 来源: 作者: 【 】 浏览:60
Tags:13.5 委托 Delegates

13.5  委托(Delegates)(2)

类SpinBoxDelegate的实现如代码段13 20所示。其成员函数createEditor()创建一个编辑器,类型为QModelIndex的函数参数是将被编辑的数据项的索引。一般情况下,该函数应该读取目标数据项中角色EditorRole对应的数据子项,并依据这个数据子项的类型决定创建什么类型的编辑器。对于本例,由于所有数据项都是数值类型,该函数无须访问目标数据项,总是返回一个能够编辑数值的QSpinBox对象。

代码段13 20,类SpinBoxDelegate的实现,取自z:\examples\mvc\spinboxdelegate\delegate.cpp

  1. QWidget *SpinBoxDelegate::createEditor(QWidget *parent,  const  QStyleOptionViewItem &/* option */,  
  2.                                          const QModelIndex &/* index */) const  
  3. {  
  4.       QSpinBox *editor = new QSpinBox(parent);  
  5.       editor->setMinimum(0);  
  6.       editor->setMaximum(100);  
  7.       return editor;  
  8. }  
  9. void SpinBoxDelegate::setEditorData(QWidget *editor, const QModelIndex  &index) const  
  10. {  
  11.       int value = index.model()->data(index, Qt::EditRole).toInt();  
  12.       QSpinBox *spinBox = static_cast<QSpinBox*>(editor);  
  13.       spinBox->setValue(value);  
  14. }  
  15. void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel  *model,  
  16.                                                const QModelIndex &index) const  
  17. {  
  18.       QSpinBox *spinBox = static_cast<QSpinBox*>(editor);  
  19.       spinBox->interpretText();  
  20.       int value = spinBox->value();  
  21.       model->setData(index, value, Qt::EditRole);  
  22. }  
  23. void SpinBoxDelegate::updateEditorGeometry(QWidget *editor, const   QStyleOptionViewItem &option,   
  24.                                                            const QModelIndex &/*                                                               index */) const  
  25. {  
  26.       editor->setGeometry(option.rect);     ①  
  27. }  

如前文所述,成员函数setEditorData()读取目标数据项的数据,初始化编辑器,而成员函数setModelData()读取编辑器中的值,将其写回目标数据项中。当用单击并拖曳图13 19中两列标头之间的分隔线时,可以更改数据项的外观尺寸。视图对象会将被编辑数据项的尺寸信息封装在QStyleOptionViewItem中,通知委托对象更改与这个数据项关联的编辑器的外观尺寸。代码段13 20中的成员函数updateEditorGeometry()将被调用。行①令编辑器占据目标数据项所占的整个区域。
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇13.4.2 选择信息的同步 下一篇13.5 委托(Delegates)(1)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: