2015-11-25 13 views
2

Я хочу, чтобы создать пользовательский список, используя QListView и поэтому мне пришлось продлить QListView, QItemDelegate и QAbstractListModel, а затем реализовать конкретные методы, наряду с QAbstractItemModel::data(const QModelIndex & index, int role = Qt::DisplayRole) const. Он отображает корректно на экране с первого взгляда, но проблема возникает после заполнения модели списка. Функция data(index,role) называется 4-5 раз для каждой модели модели с различными ролями (некоторые из них не определены роли/вне диапазона/вероятно, случайным). И это происходит не только после инициализации модели списка! Когда я наведите элемент списка, вид вызывает данные (индекс, роль) с правильным индексом и ролью, но сразу же это снова вызвано с неожиданным значением роли.данные функции Qt QAbstractItemModel() называется с неопределенной роли

Это кажется неудобным поведением. I не смог найти источник странных звонков. Я помещал журналы в каждый метод своих пользовательских классов, чтобы убедиться, что я не вызываю по ошибке метод data(index,role) с неправильными значениями.

Есть ли у кого-нибудь идеи, где искать или почему возникают эти странные вызовы?

EDIT Источник из «странных» вызывает в:

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 эти значения зарезервированы. Изменение начального значения моих пользовательских ролей решило мою проблему.

+0

Каковы упомянутые «неопределенные роли»? Каковы их ценности? – vahancho

+0

Я определил 4 роли (0,1,2,3), но функция data() вызывает 6 последовательных раз для каждого элемента со следующими ролями: 13,1,6,0,6,10 –

+1

Пользовательские роли начинаются с 0x100, 0..3 - роли, определенные Qt. См. Список ролей в qnamespace.h. 13 например ist SizeHintRole. – Jens

ответ

2

Пользовательские роли начинаются с 0x100, 0..3 - это роли, определенные Qt. См. Список ролей в qnamespace.h. 13 например ist SizeHintRole.

Различные вызовы вызова происходят из стажеров QListView, которые пытаются выяснить, как должны отображаться ячейки. Пример. Если вы хотите изменить шрифт строки, вы просто добавляете переключатель для FontRole в свою реализацию data() и передаете жирный шрифт всякий раз, когда что-то важно, и его необходимо отобразить жирным шрифтом.