传统的MVC设计模式
模型负责组织数据
视图负责显示数据
控制器负责处理用户输入
Qt中模型视图设计模式
视图中继承了处理用户输入的功能
视图将用户输入作为内部独立的子功能而实现
模型视图中的委托
1、 抽象类QAbstractItemDelegate是委托类的基类
2、 Qt4.4版本后的标准委托是QStyledItemDelegate
3、 委托(Delegate)是视图中处理用户输入的部件
4、 视图可以设置委托对象用于处理用户输入
5、 委托对象负责创建和显示用户输入上下文(创建、显示编辑框)
6、 建议以QStyledItemDelegate为基类自定义委托
委托中的编辑器
1、 委托能够提供编辑时需要的上下文环境(编辑器)
2、 不同的委托提供的编辑器类型不同(文本框、单选框等等)
3、 编辑器从模型获取数据,并将编辑结果返回模型
交互流程
委托中的关键函数
virtual QWidget * |
createEditor ( QWidget * parent, const QStyleOptionViewItem & option, const QModelIndex & index ) const |
需要编辑数据是,创建编辑器组件
virtual void |
updateEditorGeometry ( QWidget * editor, const QStyleOptionViewItem & option, const QModelIndex & index ) const |
更新编辑器组件大小
virtual void |
setEditorData ( QWidget * editor, const QModelIndex & index ) const |
通过索引index 从模型中获取数据
virtual void |
setModelData ( QWidget * editor, QAbstractItemModel * model, const QModelIndex & index ) const |
将编辑后的新数据返回模型
委托中的关键信号
void |
closeEditor ( QWidget * editor, QAbstractItemDelegate::EndEditHint hint = NoHint ) |
编辑器组件关闭信号
void |
commitData ( QWidget * editor ) |
新数据提交信号
//验证上述交互流程
//main.cpp
#include <QtGui/QApplication>
#include "Widget.h"
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
Widget w;
w.show();
return a.exec();
}
//SubStyledItemDelegate.h
#ifndef SUBSTYLEDITEMDELEGATE_H
#define SUBSTYLEDITEMDELEGATE_H
#include <QStyledItemDelegate>
class SubStyledItemDelegate : publicQStyledItemDelegate
{
Q_OBJECT
protected slots:
void onCloseEditor(QWidget* editor); //关闭编辑器组件的信号的槽函数
void onCommitData(QWidget* editor); //数据提交信号的槽函数
public: //下面的函数都由视图对象调用
explicit SubStyledItemDelegate(QObject* parent = 0);
QWidget* createEditor(QWidget *parent, const QStyleOptionViewItem&option, const QModelIndex &index) const;
void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem&option, const QModelIndex &index) const;
void setEditorData(QWidget *editor, const QModelIndex &index) const;
void setModelData(QWidget *editor, QAbstractItemModel *model, constQModelIndex &index) const;
};
#endif // SUBSTYLEDITEMDELEGATE_H
//SubStyledItemDelegate.cpp
#include"SubStyledItemDelegate.h"
#include <QDebug>
SubStyledItemDelegate::SubStyledItemDelegate(QObject*parent) :
QStyledI