2016-08-17 3 views
2

Я пытаюсь отключить мою реализацию QAbstractTableModel. Я применил методы rowCount(), columnCount() и data().Как построить QModelIndex с действующим родителем?

После не инстанцирования моей модели, независимо от того, сколько вложений глубокого, родительский индекс всегда недействителен:

parent = model->index(0, 0); 
i = model->index(0, 0, parent); // i.parent().IsValid() == false! 

Теперь, я действителен. Но i.parent() - нет. Даже если я дальнейшая вложенность:

ancestor = model->index(0, 0); 
parent = model->index(0, 0, ancestor); 
i = model->index(0, 0, parent); // i.parent().IsValid() == false! 

даже тогда, я действителен, но i.parent() не является.

У меня есть модуль, протестировавший методы rowCount и columnCount, и я утверждал, что модель является древовидной моделью, которая имеет одну строку с вложенными двумя строками. Кроме того, количество столбцов отличное от нуля.

Почему мой родительский индекс всегда недействителен?

+0

Вы уверены, что на самом деле вы устанавливаете 'i's parent? – Dillydill123

+1

Если вы хотите создать древовидную модель, вы должны получить from'QAbstractItemModel', а не 'QAbstractTableModel' – RobbieE

ответ

4

Это стол. Это не должно быть дерево. Из-за этого родитель всегда будет недействительным. Реализация QAbstractTableModel::index всегда устанавливает недопустимый родительский элемент, и он должен.

Ваши ожидания относятся к древовидной модели, а не к модели таблицы. И они применимы только к древовидной модели, если у данного родительского элемента есть дочерние элементы. Ваш тест ошибочно предполагает, что у родителя, которого он использует, есть дети, когда у него нет ни одного. Вы можете легко проверить, что: model->hasChildren(parent) всегда будет возвращать false за стол. Попытка создать индекс с бездетным родителем не определена. В идеале ваша модель должна заявить об этом. Таким образом, ваш тест будет вообще неправильным для дерева.

Если вы хотите реализовать дерево, выведите QAbstractItemModel. Затем вы будете вынуждены правильно реализовать bool hasChildren(const QModelIndex& parent) const - это метод, который должен использовать древовидный вид (и ваши тесты!), Чтобы узнать, действительно ли он запрашивает индекс для дочернего родителя данного родителя.

В общем, если model.hasChildren(parent) == false, то вы никогда не должны звонить model.index(row, col, parent). Фактически, ваша модель должна утверждать, что это так:

QModelIndex MyModel::index(int row, int col, const QModelIndex & parent) { 
    Q_ASSERT(hasChildren(parent)); 
    Q_ASSERT(row >= 0 && row < rowCount(parent)); 
    Q_ASSERT(col >= 0 && col < columnCount(parent)); 
    void * ptr = ...; // or quintptr ptr = ...; 
    return createIndex(row, col, ptr); 
} 
+0

. Тогда почему можно использовать QAbstractTableModel с QTreeView? (например, здесь http://stackoverflow.com/questions/27308309/display-data-from-qabstracttablemodel-in-qtreeview) Не работает ли это на этих же предположениях? Кроме того, у родителя, который я использую, есть дети, я применил свой метод данных, чтобы он это сделал. Как вы предлагаете мне двигаться вперед? Я переопределяю метод :: index? – Diana

+1

«QTreeView» проверяет каждый родительский элемент для детей и пытается создавать дочерние индексы, если существуют дети. Древовидный вид - это вполне допустимый способ отображения таблицы или модели списка. Модель таблицы/списка - это дерево с только туловищем. –

+0

# 1. Какое точное определение «ребенок»? Я реализовал метод data() таким образом, что он проверяет parent() и возвращает данные. Это для меня ребенок. # 2. Какая у меня альтернатива? Я не могу найти QAbstractTreeModel. – Diana

Смежные вопросы