模型视图(17):【类】QAbstractItemDelegate[官翻]

QAbstractItemDelegate 类

QAbstractItemDelegate类用于显示和编辑模型中的数据项。

Header:#include < QAbstractItemDelegate >
qmake:QT += widgets
Inherits:QObject
Inherited By:QItemDelegate, QStyledItemDelegate

详述

QAbstractItemDelegate为模型/视图体系结构中的委托提供了接口和通用功能。委托在视图中显示单独的项,并处理模型数据的编辑

QAbstractItemDelegate类是模型/视图类之一,是Qt模型/视图框架的一部分。

要以自定义的方式呈现一个项目,你必须实现paint()和sizeHint()。QStyledItemDelegate类提供了这些函数的默认实现;如果你不需要自定义呈现,子类化这个类代替。

我们举了一个在项目中绘制进度条的例子;案例是一个包的管理程序。

img

我们创建WidgetDelegate类,它继承自QStyledItemDelegate。我们在paint()函数中绘图:

 void WidgetDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option,
                            const QModelIndex &index) const
 {
     if (index.column() == 1) {
         int progress = index.data().toInt();

         QStyleOptionProgressBar progressBarOption;
         progressBarOption.rect = option.rect;
         progressBarOption.minimum = 0;
         progressBarOption.maximum = 100;
         progressBarOption.progress = progress;
         progressBarOption.text = QString::number(progress) + "%";
         progressBarOption.textVisible = true;

         QApplication::style()->drawControl(QStyle::CE_ProgressBar,
                                            &progressBarOption, painter);
     } else
         QStyledItemDelegate::paint(painter, option, index);

注意,我们使用了QStyleOptionProgressBar并初始化它的成员。然后我们可以使用当前的QStyle来绘制它。

要提供自定义编辑,可以使用两种方法。

  • 第一种方法是创建一个编辑器小部件并将其直接显示在项目的顶部。要做到这一点,您必须重新实现createEditor()来提供一个编辑器小部件,setEditorData()用来自模型的数据填充编辑器,以及setModelData()以便委托可以用来自编辑器的数据更新模型。
  • 第二种方法是通过重新实现editorEvent()直接处理用户事件。

公共类型

enum EndEditHint

这个enum描述了委托可以给模型和视图组件的不同提示,以便让用户能够轻松地编辑模型中的数据。

ConstantValueDescription
NoHint0没有要执行的建议操作。

下面这些提示可以让委托影响视图的行为:

ConstantValueDescription
EditNextItem1视图应该使用委托在视图中的下一个项目上打开编辑器。
EditPreviousItem2视图应该使用委托打开视图中前一项上的编辑器。

注意,自定义视图可能对next和previous的概念有不同的解释。

当使用缓存数据的模型(比如为了提高性能或节省网络带宽而在本地操纵数据的模型)时,以下提示最有用。

ConstantValueDescription
SubmitModelCache3如果模型缓存了数据,它应该将缓存的数据写入底层数据存储区。
RevertModelCache4如果模型缓存了数据,它应该丢弃缓存的数据,并用底层数据存储中的数据替换它。

尽管模型和视图应该以适当的方式响应这些提示,但如果不相关,定制组件可能会忽略其中的任何一个或全部。

公共函数

  1. QAbstractItemDelegate(QObject *parent = nullptr)
  2. virtual ~QAbstractItemDelegate()
  3. virtual QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
  4. virtual void destroyEditor(QWidget *editor, const QModelIndex &index) const
  5. virtual bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
  6. virtual bool helpEvent(QHelpEvent *event, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index)
  7. virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const = 0
  8. virtual void setEditorData(QWidget *editor, const QModelIndex &index) const
  9. virtual void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
  10. virtual QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const = 0
  11. virtual void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const

信号

  1. void closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint = NoHint)
  2. void commitData(QWidget *editor)
  3. void sizeHintChanged(const QModelIndex &index)

参考

  • Model/View Programming
  • QStyledItemDelegate
  • Pixelator Example
  • QStyledItemDelegate
  • QStyle
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值