Qt QAbstractItemModel 函数 data() 以未定义的角色调用
Qt QAbstractItemModel function data() called with undefined role
我想使用 QListView
创建一个自定义列表,所以我不得不扩展 QListView
、QItemDelegate
和 QAbstractListModel
,然后实现特定的方法,以及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() 实现中,并在重要且应以粗体显示时传回粗体字体。
我想使用 QListView
创建一个自定义列表,所以我不得不扩展 QListView
、QItemDelegate
和 QAbstractListModel
,然后实现特定的方法,以及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() 实现中,并在重要且应以粗体显示时传回粗体字体。