Получить индекс плоской строки из QModelIndex в QTreeView - PullRequest
0 голосов
/ 07 декабря 2018

У меня есть иерархическое структурное представление Qtreeview и модель, содержащая несколько строк с потомками следующим образом:

                                Index(index.row())        Desired flat index

- Row1                           0                               0
  - child1                       0                               1               
  - child2                       1                               2               
  - child3                       2                               3               
    - child11                    0                               4                                        
    - child22                    1                               5                  
      - child 221                0                               6                     
    - child33                    2                               7                  
      - child 31                 0                               8                     
      - child 32                 1                               9                    
  - child4                       3                               10                                      
    - child41                    0                               11                  
    - child42                    1                               12                  
- Row2                           2                               13               
  - child1                       0                               14               
    - child 11                   0                               15                   
    - child 12                   1                               16                  
      - child 121                0                               17                     
  - child2                       1                               18               
  - child3                       2                               19                   
  - child4                       3                               20               
    - child41                    0                               21                  
    - child42                    1                               22                  

Каждый индекс index.row () будет давать номер строки относительно родителя, под которым онесть.Есть ли какой-нибудь быстрый способ найти нужный плоский индекс, показанный выше на рисунке в самом Qt?Приведенный выше пример показывает очень простую иерархию.Это очень сложно, то есть имеет несколько иерархий и количество строк.

1 Ответ

0 голосов
/ 07 декабря 2018

Вы можете использовать следующий код для получения плоского индекса, который соответствует данному модельному индексу:

// Returns the total number of children (and grand children).
static int childCount(const QModelIndex &index)
{
  auto model = index.model();
  int count = model->rowCount(index);
  for (int r = 0; r < count; ++r) {
    count += childCount(index.child(r, 0));
  }
  return count;
}

// Returns the flat index for the given model index (hierarchical).
static int flatIndex(const QModelIndex &index)
{
  if (!index.isValid()) {
    return -1;
  }

  int result = index.row() + 1;
  auto parent = index.parent();

  // Get the number of all items above.
  for (int r = 0; r < index.row(); ++r) {
    result += childCount(index.model()->index(r, 0, parent));
  }

  return result + flatIndex(parent);
}

Надеюсь, понятно, как он рассчитывает индекс.

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