Чтение онлайн

на главную - закладки

Жанры

QT 4: программирование GUI на С++

Саммерфилд Марк

Шрифт:

Указатель Node * на дочерний элемент можно получить из списка дочерних элементов children родительской вершины. Указатель на родительскую вершину извлекается из индекса модели parent, используя закрытую функцию nodeFromIndex:

01 Node *RegExpModel::nodeFromIndex(

02 const QModelIndex &index) const

03 {

04 if (index.isValid) {

05 return static_cast<Node *>(index.internalPointer);

06 } else {

07 return rootNode;

07 }

Функция nodeFromIndex

приводит тип void * заданного индекса в тип Node * или возвращает указатель на корневую вершину, если индекс недостоверен, поскольку недостоверный индекс модели используется для представления корня модели.

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 }

Получить QModelIndex родительского элемента из дочернего немного сложнее, чем найти дочерний элемент родителя. Можно легко получить родительскую вершину, применяя сначала функцию nodeFromIndex и поднимаясь затем вверх с помощью указателя на родительский элемент, но для получения номера строки (позиции родительской верщины в соответствующем списке дочерних вершин) мы должны перейти к родителю родительского элемента и найти в его списке дочерних элементов значение индекса первого родителя (родителя исходной дочерней вершины).

01 QVariant RegExpModel::data(const QModelIndex

02 &index, int role) const

03 {

04 if (role != Qt::DisplayRole)

05 return QVariant;

06 Node *node = nodeFromIndex(index);

07 if (!node)

08 return QVariant;

09 if (index.column == 0) {

10 switch (node->type) {

11 case Node::RegExp:

12 return tr("RegExp");

13 case Node::Expression:

14 return tr("Expression");

15 case Node::Term:

16 return tr("Term");

17 case Node::Factor:

18 return tr("Factor");

19 case Node::Atom:

20 return tr("Atom");

21 case Node::Terminal:

22 return tr("Terminal");

23 default:

24 return tr("Unknown");

25 }

26 } else if (index.column == 1) {

27 return node->str;

28 }

29 return QVariant;

30 }

В

функции data получаем для запрошенного элемента указатель Node * и используем его для получения доступа к данным соответствующей вершины. Если вызывающая программа запрашивает какую-нибудь роль, отличную от Qt::DisplayRole, или если не удается получить вершину Node для заданного индекса модели, мы возвращаем недействительное значение типа QVariant. Если столбец равен 0, возвращаем название типа вершины; если столбец равен 1, вбзвращаем значение вершины (ее строку).

01 QVariant RegExpModel::headerData(int section,

02 Qt::Orientation orientation, int role) const

03 {

04 if (orientation == Qt::Horizontal && role == Qt::DisplayRole) {

05 if (section == 0) {

06 return tr("Node");

07 else if (section == 1) {

08 return tr("Value");

09 }

10 }

11 return QVariant;

12 }

При переопределении функции headerData мы возвращаем соответствующие метки горизонтального заголовка. Класс QTreeView, который используется для визуального представления иерархических моделей, не имеет заголовков строк, поэтому мы их игнорируем.

Теперь, когда рассмотрены классы Node и RegExpModel, давайте посмотрим, как создается корневая вершина, когда пользователь изменяет текст в строке редактирования.

Поделиться:
Популярные книги

Барон играет по своим правилам

Ренгач Евгений
5. Закон сильного
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Барон играет по своим правилам

Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Клеванский Кирилл Сергеевич
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.51
рейтинг книги
Сердце Дракона. нейросеть в мире боевых искусств (главы 1-650)

Герцогиня в ссылке

Нова Юлия
2. Магия стихий
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Герцогиня в ссылке

Ну привет, заучка...

Зайцева Мария
Любовные романы:
эро литература
короткие любовные романы
8.30
рейтинг книги
Ну привет, заучка...

На Ларэде

Кронос Александр
3. Лэрн
Фантастика:
фэнтези
героическая фантастика
стимпанк
5.00
рейтинг книги
На Ларэде

Сердце Дракона. Том 12

Клеванский Кирилл Сергеевич
12. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.29
рейтинг книги
Сердце Дракона. Том 12

Истинная поневоле, или Сирота в Академии Драконов

Найт Алекс
3. Академия Драконов, или Девушки с секретом
Любовные романы:
любовно-фантастические романы
6.37
рейтинг книги
Истинная поневоле, или Сирота в Академии Драконов

Кодекс Охотника. Книга VI

Винокуров Юрий
6. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга VI

Гардемарин Ее Величества. Инкарнация

Уленгов Юрий
1. Гардемарин ее величества
Фантастика:
городское фэнтези
попаданцы
альтернативная история
аниме
фантастика: прочее
5.00
рейтинг книги
Гардемарин Ее Величества. Инкарнация

Сама себе хозяйка

Красовская Марианна
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Сама себе хозяйка

Душелов. Том 3

Faded Emory
3. Внутренние демоны
Фантастика:
альтернативная история
аниме
фэнтези
ранобэ
хентай
5.00
рейтинг книги
Душелов. Том 3

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

Стеллар. Заклинатель

Прокофьев Роман Юрьевич
3. Стеллар
Фантастика:
боевая фантастика
8.40
рейтинг книги
Стеллар. Заклинатель

Возвышение Меркурия. Книга 5

Кронос Александр
5. Меркурий
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Возвышение Меркурия. Книга 5