Вопрос: QTreeView / QAbstractItemModel поддеревья в нескольких столбцах


Я работаю над подклассом QAbstractItemModel который подключается к QTreeView, Он имеет рекурсивный Name = Value type - любой индекс может иметь собственное поддерево. Это хорошо с левой стороны, потому что почти каждый вид дерева там работает так. Проблема в том, что иногда я хочу поддерево только с правой стороны - список значений. Поскольку у меня есть это прямо сейчас, кажется, что это должен  работать, но Qt никогда не вызывает rowCount() для правой стороны, и никогда не понимая, что там должно быть поддерево.

Решение, которое у меня есть сейчас, состоит в том, чтобы создать для этого отдельную модель и использовать setIndexWidget чтобы каждый раз это происходило при каждом отдельном дереве. Все в порядке, но я бы очень хотел, чтобы поддеревья отображались справа, без необходимости бросать древовидные взгляды повсюду. Моя модель отвечает, что там есть поддеревья, но Qt просто не просит их.

Если это немного неясно, это основная идея того, чего я хочу достичь:

- Root        |
  - Name 1    |    Value
      Name 2  |  - Compound Value
              |      Sub-value 1
              |      Sub-value 2
      Name 3  |  + Compound Value (collapsed)
  + Name 4    |    Value

Как бы то ни было, значения соединения не получат +и -рядом с ними, потому что Qt никогда не вызывает hasChildren() или же rowCount() в этой колонке, хотя моя модель вернет это, да, есть дети, если бы это было задано.

Если я в конечном итоге должен дать ему представление поддерева, все в порядке. Я просто хотел бы быть уверенным, что сначала нет лучшего способа сделать это.


4


источник


Ответы:


Я пытаюсь реализовать двойное дерево. Посмотрите на себя, что-то вроде

+ a        |    A
  + b      |  + B
    c      |      C

и из того, что я видел, вы можете сделать пространство между именем 2 и именем 3, возвращая пустые данные, например. пустую строку под именем 2, которая позволит вам иметь + infront.

Так что-то вроде этого может помочь

def data(self, index, role): 
    ...
    if item.pathdepth() > 3 : 
        return " "
    ...

def flags(self, index)
    ...
    if item.pathdepth() > 3 : 
        return Qt.Some_Role but not others
    ...

Я пока не знаю достаточно о ролях, но вы можете отключить выбор и редактирование, чтобы пользовательские пробелы не были выбраны.

Но я не разработал, как получить дерево во втором столбце.


0