QAbstractItemModel.parent (), почему? - PullRequest
8 голосов
/ 15 мая 2009

Я новичок (Py) в Qt, портирую код графического интерфейса C # на Qt уже пару дней. Один вопрос, который я постоянно задаю себе, заключается в том, почему подклассы QAbstractItemModel необходимы для предоставления метода parent(), и почему они должны указывать в результирующем QModelIndex строку потомка в родительском элементе?

Это требование вынуждает меня добавить еще один слой поверх данных дерева (потому что я не хочу вызывать indexOf(item) в parent(), это было бы не очень эффективно), который запоминает индексы строк.

Я спрашиваю об этом, потому что впервые вижу вид на основе модели, требующий этого. Например, NSOutlineViewDataSource в Какао не требует этого.

Разработчики Trolltech - умные люди, поэтому я уверен, что для этого есть веская причина, я просто хочу знать, по какой причине.

Ответы [ 2 ]

7 голосов
/ 15 мая 2009

Быстрый ответ: «Они думали, что это лучше всего в то время». Разработчики Qt - такие же люди, как вы и я - они не идеальны и делают ошибки. Они извлекли уроки из этого опыта, и результат в работах в виде Itemviews-NG .

Своими словами по ссылке выше:

Давайте просто скажем, что есть место для улучшения, много места!

Предоставляя родителя, который содержит индекс строки и столбца, они предоставляют один из возможных способов реализации деревьев и поддержки навигации. Они могли бы так же легко использовать более очевидную реализацию графа.

2 голосов
/ 15 мая 2009

Требование в первую очередь для поддержки деревьев. Я не могу сказать вам причину, так как я не разработчик Qt ... Я только использую материал. Однако, если вы не работаете с деревьями, вы, вероятно, могли бы использовать один из более настроенных классов моделей и не иметь дело с дополнительными расходами на предоставление родителя. Я считаю, что и QAbstractListModel, и QAbstractTableModel обрабатывают родительскую часть сами, что позволяет вам просто беспокоиться о данных, которые вы хотите.

Что касается деревьев, я подозреваю, что одной из причин, по которой им нужен родитель, является то, что они стараются только запрашивать информацию, которую им нужно извлечь. Не зная всех элементов дерева (например, если оно не было развернуто), установить абсолютную позицию данного элемента в дереве становится намного сложнее.

Что касается использования indexOf(item) в родительской функции, рассматривали ли вы вопрос об использовании QModelIndex internalId или internalPointer? Я предполагаю, что они доступны в PyQt ... они могут использоваться вашей моделью для отслеживания информации об индексе. Вы могли бы использовать это для сокращения усилий по поиску индекса родителя.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...