(四十一)视图中的委托

视图与委托

1、  委托是视图的一部分,需要承担数据显示的部分工作

2、  视图负责确定数据的显示方式(列表、表格、树形)

3、  委托负责具体数据项的显示和编辑(数据项值、编辑器)

4、  视图和委托共同完成数据显示功能和数据编辑功能

 

/*

1、在视图setItemDelegate()时,将参数设置为NULL,即取消视图的委托,运行时,仍能看出视图是以怎样的方式显示数据的(能分别是列表、表格、还是树形),甚至能显示出模型的HeaderLabel,但是不能显示具体的数据项,双击也不会出现编辑框,也就是不能编辑数据项。

2、注释掉委托的paint()成员函数的函数体,运行时,现象与1类似,不同的地方在于,虽不能显示具体数据项,但能显示数据项的外围线条,双击也会出现编辑框,并能编辑数据项

*/

 

改变视图中数据项的显示方式

自定义委托的默认数据项显示方式

1、 重写paint ()成员函数

2、  在paint ()中自定义数据项显示方式

3、  重写editorEvent()成员函数

4、  在editorEvent()中处理交互事件

 

定义数据项显示方式

//伪代码

void CustomizedItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index)const
{
    if( /* 数据项满足自定义显示条件 */)
    {
        //1. 根据索引参数获取模型中的数据
       
        //2. 定义绘制参数对象
        QStyleOptionXXXX xxxxOption;
       
        //3. 设置具体参数到xxxxOption对象
       
        //4. 根据参数对象xxxxOption绘制数据显示方式
       QApplication::style()->drawControl(QStyle::CE_XXXX,
                                           &xxxxOption,
                                          painter);       
    }
    else
    {
        QItemDelegate::paint(painter, option,index);
    }
}


 

处理交互事件

//伪代码

boolCustomizedItemDelegate::editorEvent(QEvent *event, QAbstractItemModel *model,const QStyleOptionViewItem &option, const QModelIndex &index)    
{
   bool ret = true;
        
   if( /* 数据项满足自定义显示条件 */)        
    {       
                   //1.转换事件event类型
       
       if( /* 发生事件的具体类型满足并在option内*/)
       {       
                   //2.根据index去模型中取数据
 
                   //3.修改数据并返回模型
 
       }
    }
   else 
    {
       ret = QItemDelegate::editorEvent(event, model, option, index);
    }
 
   return ret;                 //表明已经处理
}


一、

//CustomizedItemDelegate.h

 

#ifndef CUSTOMIZEDITEMDELEGATE_H
#define CUSTOMIZEDITEMDELEGATE_H
 
#include <QItemDelegate>
#include <QModelIndex>
 
class CustomizedItemDelegate : publicQItemDelegate
{
   Q_OBJECT
 
public:
   explicit CustomizedItemDelegate(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;
   void paint(QPainter *painter, const QStyleOptionViewItem &option,const QModelIndex &index) const;
   bool editorEvent(QEvent *event, QAbstractItemModel *mo
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值