QItemDelegate
当我们想重新实现一个代理时,可以子类化QItemDelegate。实现item编辑时特定的效果,比如在item编辑时我们设置一个QSpinBox返回。
创建一个QApplication项目,然后我们新增一个类,类名叫做spinboxdelegate。
1 | class SpinBoxDelegate : public QItemDelegate |
SpinBoxDelegate类中声明了几个函数,这些函数在QItemDelegate继承而来,通过重写实现我们自己定义的代理功能。
createEditor函数是在item被双击后进入编辑状态时触发的,返回一个QWidget控件用来管理编辑。
setModelData是在item被修改后触发的,将改动的内容写入model中。
setEditorData是在item被双击进入编辑状态时,将model的内容写入editor中。
updateEditorGeometry是刷新editor的矩形区域,因为随着item变大或者拉伸,它的区域也要随之刷新。
具体实现
1 创建editor, 返回一个spinbox
1 | QWidget * SpinBoxDelegate::createEditor(QWidget* parent, const QStyleOptionViewItem &option, |
2 在编辑状态时,将model的数据写入editor
1 | void SpinBoxDelegate::setEditorData(QWidget *editor, const QModelIndex &index) const { |
3 编辑完成时将editor的内容写入model
1 | void SpinBoxDelegate::setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const { |
4 刷新矩形区域
1 | void SpinBoxDelegate::updateEditorGeometry(QWidget *editor, |
接下来我们在MainWindow的构造函数里创建两个model和view,我们对其中的一个view使用我们自定义的delegate
1 | MainWindow::MainWindow(QWidget *parent) : |
运行程序后,双击两个view的item,可以看到效果的不同