QTreeView / QAbstractItemModel поддеревья в нескольких столбцах - PullRequest
4 голосов
/ 20 марта 2012

Я работаю над подклассом 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() в этом столбце, даже если моя модель выдаст это да, есть дети, если бы их спросили.

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

1 Ответ

0 голосов
/ 05 августа 2012

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

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

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

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

...