视图与委托
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