传统的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

这篇博客探讨了Qt中的模型视图设计模式,强调了委托在处理用户输入中的关键角色。文章详细介绍了委托的定义、功能以及如何自定义委托类,包括创建编辑器、数据交互流程和关键函数。此外,还提到了委托的本质是为视图提供数据编辑环境并生成界面元素。
最低0.47元/天 解锁文章
1145

被折叠的 条评论
为什么被折叠?



