QAbstractItemModel :: columnCount - переменное количество столбцов для каждой строки

Мы реализуем структуру QAbstractItemModel, как показано на диаграмме ниже, и хотели бы этого;

  • узел A должен содержать 3 столбца данных
  • узел B содержит 8 столбцов данных
  • узел C содержит 5 столбцов данных

введите описание изображения здесь

Однако, глядя на подпись для QAbstractItemModel :: columnCount, неясно, как реализовать указанное выше требование. Трудно определить, что узел A должен иметь 3 столбца, узел B должен иметь 8 столбцов, а узел C должен иметь 5 столбцов, что дает только родительский индекс.

int QAbstractItemModel :: columnCount (const QModelIndex & parent = QModelIndex ()) const

Возвращает количество столбцов для дочерних элементов данного родителя.

В большинстве подклассов количество столбцов не зависит от родительского.

QAbstractItemModel :: columnCount

Этот тип проблемы, безусловно, можно решить с помощью QAbstractItemModel. Что я делаю не так или не думаю? Оцените любой вклад по этому вопросу.


person Lars    schedule 17.03.2021    source источник


Ответы (1)


Не знаю, поможет ли это вам, но я реализовал модель дерева, чтобы понять, как писать модели. Это у меня на github: https://github.com/jplflyer/qt-TreeViewDemo

Чтобы ответить на ваш конкретный вопрос: вам передан объект QModelIndex, и вы должны выяснить, на какие данные он указывает, и использовать их для определения количества дочерних элементов.

У вас уже должен быть код, который принимает QModelIndex и возвращает данные столбца, поэтому вы можете использовать тот же код, чтобы знать, что возвращать.

person Joseph Larson    schedule 17.03.2021
comment
В методе QAbstractItemModel :: data (..) нам предоставляется QModelIndex для фактических данных. В этом сценарии я чувствую, что у нас есть вся информация, необходимая для возврата правильных данных. Однако в методе QAbstractItemModel :: columnCount (..) нам предоставляется QModelIndex для родителя. В этом сценарии мне сложно понять, когда мне следует вернуть 3 (узел A), 8 (узел B) или 5 (узел C). - person Lars; 18.03.2021
comment
Пришлось много экспериментировать. Возможно, на данный момент верните константу и выполните некоторые отладочные данные. Посмотрите, на что на самом деле указывает указатель. - person Joseph Larson; 18.03.2021