什么是Qt MVC代理
图1 显示的是我们看到表格正常显示的样子。
图2 当在单元个上双击,显示的是在此单元格上设置的代理。
这里代理是一个Spinbox,这个Spinbox会读取当前单元格的内容,覆盖在当前单元格之上,
并且提供编辑功能,当用户编辑完成之后,比如,修改了Spinbox的数字后,点击此单元格意外的地方,
代理消失,把代理修改的参数设置到当前的单元格上,重新显示图1一个正常的表格。
可以简单的理解,代理其实就是提供一个编辑功能的面板,把QtMVC的部件与编辑面板合二为一。
在这里主要借助Qt提供的Spin Box Delegate Example例子来简单理解一下。
这个例子中自定义代理SpinBoxDelegate继承QItemDelegate,
至少要实现上图中的四个虚函数。
1
QWidget *createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const;
这个函数重载自虚基类,这个函数返回一个用来编辑index指定的item的widget,parent widget和option参数用来控制这个editor widget编辑面板如何的显示。
也就是说这个editor widget需要设置parent 为参数传递过来的parent,这样调用者才能把这个编辑器放到它的内部。
在这个函数中初始化你想要的编辑器。
2
void setEditorData(QWidget *editor, const QModelIndex &index) const;
这个函数也是重载了基类的虚函数。
函数的功能是,将当前modeindex中的数据取出来,放到编辑器editor中,
默认的是把数据放到modeindex的 index.model()->data(index,Qt::EditRole)中
3
void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const;
这个函数同样重载自虚基类。
这个函数的功能是,将editor中的内容提取出来,设置到当前选中的单元格中。
默认的是把数据放到modeindex的 index.model()->data(index, Qt::EditRole)中
4
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const;
根据option来更新编辑器的几何属性。
这里是简单的讲解Spin Box Delegate Example例子,
具体内容需要查看例子源码。