(四十)模型视图中的委托

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

传统的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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值