2

我想使用创建自定义列表QListView,因此我必须扩展QListViewQItemDelegate然后QAbstractListModel实现特定方法,以及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

1 回答 1

2

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

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

于 2015-11-25T10:05:24.063 回答