Qt QAbstractItemModel 函数 data() 以未定义的角色调用

Posted

技术标签:

【中文标题】Qt QAbstractItemModel 函数 data() 以未定义的角色调用【英文标题】:Qt QAbstractItemModel function data() called with undefined role 【发布时间】:2015-11-25 09:18:56 【问题描述】:

我想使用QListView 创建一个自定义列表,因此我必须扩展QListViewQItemDelegateQAbstractListModel,然后实现特定的方法,以及QAbstractItemModel::data(const QModelIndex & index, int role = Qt::DisplayRole) const。 乍一看在屏幕上显示正确,但填充列表模型后出现问题。,函数data(index,role)每个项目模型调用4-5次不同角色(其中一些未定义角色/超出范围/可能是随机的)。而且它不仅发生在列表模型初始化之后!当我悬停一个列表元素时,视图使用正确的索引和角色调用 data(index,role),但随后又以意外的角色再次调用价值

这似乎是一种尴尬的行为。我找不到奇怪电话的来源。我在自定义类的每个方法中都添加了日志,以确保不会错误地调用具有错误值的 data(index,role) 方法。

有没有人知道在哪里查看或为什么会发生这种奇怪的调用?

编辑 “奇怪”调用的来源在:

QSize CDelegate::sizeHint(const QStyleOptionViewItem & option, const QModelIndex & index) const

        return QSize(QItemDelegate::sizeHint(option, index));

调用QItemDelegate::sizeHint() 时,它会以不同的角色值触发data()

在我的例子中,我定义了从 0(0,1,2,3) 开始的角色值。根据@Jens,这些值是保留的。更改自定义角色的起始值解决了我的问题。

【问题讨论】:

提到的“未定义角色”是什么?他们的价值观是什么? 我定义了 4 个角色(0,1,2,3),但是函数 data() 每个项目连续调用 6 次,角色如下:13,1,6,0,6,10 自定义角色从 0x100 开始,0..3 是 Qt 定义的角色。请参阅 qnamespace.h 中的角色列表。 13 例如 ist SizeHintRole. @IspasClaudiu,一切看起来都正确。 Qt 需要几种类型的数据来正确呈现一个项目。在您的情况下,它们是:SizeHintRole、DecorationRole、FontRole、DisplayRole、FontRole、CheckStateRole。 @Jens。确实,更改我的自定义角色起始值解决了我的问题,但我仍然不知道为什么 data(index,role) 函数使用上面指定的那些值调用。请考虑添加答案以将问题标记为已解决 【参考方案1】:

自定义角色从 0x100 开始,0..3 是 Qt 定义的角色。请参阅 qnamespace.h 中的角色列表。 13 例如 ist SizeHintRole。

不同的角色调用源于 QListView 的实习生,他们试图弄清楚应该如何显示单元格。示例:如果您想更改一行的字体,只需将 FontRole 的开关添加到您的 data() 实现中,并在某些重要且应以粗体显示时传回粗体字体。

【讨论】:

以上是关于Qt QAbstractItemModel 函数 data() 以未定义的角色调用的主要内容,如果未能解决你的问题,请参考以下文章

qabstractitemmodel 数据在 qml 中没有改变

Qt入门教程数据模型篇QAbstractItemModel抽象模型基类

Qt入门教程数据模型篇QAbstractItemModel抽象模型基类

Qt入门教程高级控件篇QModelIndex索引

如何在 QAbstractItemModel 中为 QTreeView 创建人工节点

Qt QItemSelection::indexes() 返回错误