Требуется реализовать метод QAbstractItemModel.parent()
, иначе получится эта неприятная ошибка:
NotImplementedError: QAbstractItemModel.parent() is abstract and must be overridden
Помимо .parent()
, метод index()
также необходимо переопределить или указать:
NotImplementedError: QAbstractItemModel.index() is abstract and must be overridden
ВОПРОС: какова цель обоих методов и в чем разница в том, как они работают?
ИЗМЕНЕНО ПОЗЖЕ:
Пример метода .parent()
:
def getNodeFromIndex(self, index):
if index.isValid():
node = index.internalPointer()
if node:
return node
return self.items
def parent(self, index):
node = self.getNodeFromIndex(index)
parentNode = node.getParent()
if parentNode == self.items:
return QtCore.QModelIndex()
return self.createIndex(parentNode.row(), 0, parentNode)
Пример метода .index()
:
def index(self, row, column, parentIndex):
parentNode = self.getNodeFromIndex(parentIndex)
childNode = parentNode.getChildren(row)
if childNode:
newIndex=self.createIndex(row, column, childNode)
return newIndex
else:
return QtCore.QModelIndex()
Из бесконечного тестирования я действительно вижу, что .parent()
метод вызывается только для QTableView
элементов верхнего уровня. Хотя .index () вызывается для всех элементов: дочерние элементы верхнего уровня, дочерние элементы второго уровня, элементы-внуки третьего уровня и т. Д., Я также вижу, что оба возвращают QModelIndex
со строкой, столбцом и переменной данных, «связанными» к нему. Похоже, что QModelIndexes, возвращаемые обоими методами, должны быть синхронизированы.
.parent()
возвращает родительский элемент модели с заданным индексом. Если у элемента нет родителя, возвращается недопустимый QModelIndex
. Обычное соглашение, используемое в моделях, которые предоставляют древовидные структуры данных, заключается в том, что только элементы в первом столбце имеют дочерние элементы. В этом случае при повторной реализации этой функции в подклассе столбец возвращенного QModelIndex
будет равен 0. При повторной реализации этой функции в подклассе будьте осторожны, чтобы не вызывать QModelIndex
функций-членов, таких как QModelIndex::parent()
, поскольку индексы, принадлежащие вашей модели, будут просто назовите вашу реализацию, ведущую к бесконечной рекурсии.
.index()
возвращает индекс элемента в модели, заданной данной строкой, столбцом и родительским индексом. При повторной реализации этой функции в подклассе вызовите createIndex()
, чтобы сгенерировать индексы модели, которые другие компоненты могут использовать для ссылки на элементы в вашей модели.
Стоит отметить, что оба метода используют метод self.createIndex(row, column, dataVariable)
. Итак, они оба делают одно и то же: создают QModelIndexes. Я просто не понимаю, зачем нам нужны два метода, чтобы делать одно и то же! И это сложно отладить, так как кажется, что они работают в бесконечном цикле ....
.parent()
метод вызывается только для элементов QTableView верхнего уровня. В то время как.index()
вызывается для всех элементов: дочерние элементы верхнего уровня, дочерние элементы второго уровня, элементы внуков третьего уровня и т. Д. Я также вижу, что оба возвращают QModelIndex со связанной с ним строкой, столбцом и переменной данных. Похоже, что QModelIndexes, возвращаемые обоими методами, должны быть синхронизированы. - person alphanumeric   schedule 10.01.2015.parent()
возвращает родителя элемента модели с заданным индексом. Если у элемента нет родителя, возвращается недопустимый QModelIndex. Обычное соглашение, используемое в моделях, которые предоставляют древовидные структуры данных, заключается в том, что только элементы в первом столбце имеют дочерние элементы. В этом случае при повторной реализации этой функции в подклассе столбец возвращенного QModelIndex будет равен 0. При повторной реализации этой функции в подклассе будьте осторожны, чтобы избежать вызова функций-членов QModelIndex, таких как QModelIndex :: parent (), поскольку индексы принадлежат к вашей модели просто вызовет вашу реализацию, ведущую к бесконечной рекурсии. - person alphanumeric   schedule 10.01.2015.index()
возвращает индекс элемента в модели, заданной данной строкой, столбцом и родительским индексом. При повторной реализации этой функции в подклассе вызовите createIndex (), чтобы сгенерировать индексы модели, которые другие компоненты могут использовать для ссылки на элементы в вашей модели. - person alphanumeric   schedule 10.01.2015self.createIndex(row, column, dataVariable)
. Итак, они оба делают одно и то же: создают QModelIndexes. Я просто не понимаю, зачем нам нужны два метода, чтобы делать одно и то же! И это сложно отладить, так как кажется, что они работают в бесконечном цикле ... - person alphanumeric   schedule 10.01.2015