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

Qt QAbstractItemModel function data() called with undefined role

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

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

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

编辑 "strange" 调用的来源在:

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 的说法,这些值是保留的。更改自定义角色的起始值解决了我的问题。

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

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