QAbstractItemDelegate 类
QAbstractItemDelegate类用于显示和编辑模型中的数据项。
Header: | #include < QAbstractItemDelegate > |
---|---|
qmake: | QT += widgets |
Inherits: | QObject |
Inherited By: | QItemDelegate, QStyledItemDelegate |
详述
QAbstractItemDelegate为模型/视图体系结构中的委托提供了接口和通用功能。委托在视图中显示单独的项,并处理模型数据的编辑。
QAbstractItemDelegate类是模型/视图类之一,是Qt模型/视图框架的一部分。
要以自定义的方式呈现一个项目,你必须实现paint()和sizeHint()。QStyledItemDelegate类提供了这些函数的默认实现;如果你不需要自定义呈现,子类化这个类代替。
我们举了一个在项目中绘制进度条的例子;案例是一个包的管理程序。
我们创建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描述了委托可以给模型和视图组件的不同提示,以便让用户能够轻松地编辑模型中的数据。
Constant | Value | Description |
---|---|---|
NoHint | 0 | 没有要执行的建议操作。 |
下面这些提示可以让委托影响视图的行为:
Constant | Value | Description |
---|---|---|
EditNextItem | 1 | 视图应该使用委托在视图中的下一个项目上打开编辑器。 |
EditPreviousItem | 2 | 视图应该使用委托打开视图中前一项上的编辑器。 |
注意,自定义视图可能对next和previous的概念有不同的解释。
当使用缓存数据的模型(比如为了提高性能或节省网络带宽而在本地操纵数据的模型)时,以下提示最有用。
Constant | Value | Description |
---|---|---|
SubmitModelCache | 3 | 如果模型缓存了数据,它应该将缓存的数据写入底层数据存储区。 |
RevertModelCache | 4 | 如果模型缓存了数据,它应该丢弃缓存的数据,并用底层数据存储中的数据替换它。 |
尽管模型和视图应该以适当的方式响应这些提示,但如果不相关,定制组件可能会忽略其中的任何一个或全部。
公共函数
- QAbstractItemDelegate(QObject *parent = nullptr)
- virtual ~QAbstractItemDelegate()
- virtual QWidget * createEditor(QWidget *parent, const QStyleOptionViewItem &option, const QModelIndex &index) const
- virtual void destroyEditor(QWidget *editor, const QModelIndex &index) const
- virtual bool editorEvent(QEvent *event, QAbstractItemModel *model, const QStyleOptionViewItem &option, const QModelIndex &index)
- virtual bool helpEvent(QHelpEvent *event, QAbstractItemView *view, const QStyleOptionViewItem &option, const QModelIndex &index)
- virtual void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const = 0
- virtual void setEditorData(QWidget *editor, const QModelIndex &index) const
- virtual void setModelData(QWidget *editor, QAbstractItemModel *model, const QModelIndex &index) const
- virtual QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const = 0
- virtual void updateEditorGeometry(QWidget *editor, const QStyleOptionViewItem &option, const QModelIndex &index) const
信号
- void closeEditor(QWidget *editor, QAbstractItemDelegate::EndEditHint hint = NoHint)
- void commitData(QWidget *editor)
- void sizeHintChanged(const QModelIndex &index)
参考
- Model/View Programming
- QStyledItemDelegate
- Pixelator Example
- QStyledItemDelegate
- QStyle