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

Я работаю над подклассом QAbstractItemModel, который подключается к QTreeView. Он имеет рекурсивную структуру типа Name = Value - любой индекс может иметь собственное поддерево. Это нормально для левой стороны, потому что почти все древовидные представления работают именно так. Проблема в том, что иногда мне нужно поддерево только с правой стороны - список значений. Поскольку у меня это есть прямо сейчас, кажется, что это должно работать, но 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() в этом столбце, даже если моя модель вернет, что да, есть дочерние элементы, если бы об этом спросили.

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


person parkovski    schedule 19.03.2012    source источник
comment
Вы когда-нибудь находили решение? У меня аналогичная ситуация, но модель абстрактного элемента, похоже, допускает поддерево только в первом столбце.   -  person subhacom    schedule 06.12.2012
comment
Я решил это, поместив отдельные древовидные представления во второй столбец, если мне нужно было его расширить. Не самый элегантный подход, но быстрый и легкий. Если вы хотите, чтобы он выглядел безупречно, вам, вероятно, придется создать подкласс QTreeView. Я не работал с Qt с мая прошлого года, так что ничего не могу поделать.   -  person parkovski    schedule 28.12.2012


Ответы (1)


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

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

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

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

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
    ...

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

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

person Carel    schedule 05.08.2012