При установке новой корневой вершины мы начинаем с удаления предыдущей корневой вершины (и всех ее дочерних вершин). Затем мы устанавливаем новое значение для корневой вершины и вызываем функцию
01 QModelIndex RegExpModel::index(int row, int column,
02 const QModelIndex &parent) const
03 {
04 if (!rootNode)
05 return QModelIndex;
06 Node *parentNode = nodeFromIndex(parent);
07 return createIndex(row, column, parentNode->children[row]);
08 }
Функция
В нашей реализации
Указатель
01 Node *RegExpModel::nodeFromIndex(
02 const QModelIndex &index) const
03 {
04 if (index.isValid) {
05 return static_cast
06 } else {
07 return rootNode;
07 }
Функция
01 int RegExpModel::rowCount(const QModelIndex
02 &parent) const
03 {
04 Node *parentNode = nodeFromlndex(parent);
05 if (!parentNode)
06 return 0;
07 return parentNode->children.count;
08 }
Число строк для заданного элемента определяется просто количеством дочерних элементов.
01 int RegExpModel::columnCount(const QModelIndex &
02 /* родительский элемент */) const
03 {
04 return 2;
05 }
Число столбцов фиксировано и равно 2. Первый столбец содержит типы вершин; второй столбец содержит значения вершин.
01 QModelIndex RegExpModel::parent(const QModelIndex
02 &child) const
03 {
04 Node*node = nodeFromIndex(child);
05 if (!node)
06 return QModelIndex;
07 Node *parentNode = node->parent;
08 if (!parentNode)
09 return QModelIndex;
10 Node *grandparentNode = parentNode->parent;
11 if (!grandparentNode)
12 return QModelIndex;
13 int row = grandparentNode->children.indexOf(parentNode);
14 return createIndex(row, child.column, parentNode);
15 }