Представление дерева Qt модели и представление таблицы - PullRequest
3 голосов
/ 30 августа 2009

У меня есть список объектов Product (в виде строк), каждый объект имеет несколько полей данных (таких как id продукта, семейство продуктов и т. Д.) - в виде столбцов. Мне удалось создать подкласс QAbstractTableModel для табличной модели и отобразить данные в QTableView.

Что я хочу, так это предоставить «сгруппированный» вид модели в древовидной структуре. Например, я хочу сгруппировать товары по идентификатору их семейства, поэтому дерево должно содержать на первом уровне группы (идентификаторы семейства), а их потомки - это продукты, имеющие идентификаторы семейства.

Есть идеи?

PS: Потребность в нескольких группировках (группировка по идентификатору семьи, группировка по другому столбцу и т. Д.) Показывает, что модель должна представлять собой дерево. Корневые узлы указывают группы, а затем дочерние элементы являются членами группы. Многократная группировка может быть достигнута многоуровневыми деревьями.

Тогда мой преобразованный вопрос заключается в следующем: Как я могу реализовать специальный класс QTableView, который отображает только листья дерева (на данном уровне)? (Потому что на самом деле листья - это реальные объекты, которые мы хотели бы видеть в сетке)

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

Я немного покопался и обнаружил, что в QTableView :: paintEvent при отображении каждой строки и столбца фактический элемент извлекается как:

const QModelIndex index = d-> model-> index (row, col, d-> root);

где d-> root () - корневой узел, заданный setRootIndex (). Это должно быть встроено в код обхода дерева, и все будет хорошо. Но как мне избежать повторной реализации всего метода paintEvent?

1 Ответ

1 голос
/ 30 августа 2009

В зависимости от того, сколько настроек вы хотите, QTreeWidget может быть самым простым маршрутом, но если у вас уже есть модель, это зависит от того, из какой вы получили модель. Чтобы получить доступ к функциональности, вам нужно добавить дочерние структуры в строки, которые вы уже создали. Возможно, вы пропустили его, но класс QModelIndex имеет поле «родитель», это помогает построить иерархическую структуру.

Вероятно, вы будете хорошо обслужены, если будете посещать занятия QStandardItem и QStandardItemModel. Они имеют приличный интерфейс для построения древовидной структуры, в зависимости от того, какие данные, которые вам понадобятся для отображения каждого уровня в иерархии, могут иметь различное количество столбцов, и глубина не ограничена.

Если вы чувствуете приключения, вы можете взять его сверху и просто внедрить интерфейс QAbstractItemModel, но иногда это может быть трудно сделать правильно.

В целом, я думаю, что это одна из самых странных концепций в QT из-за количества размерностей, которые есть в QAbstractItemModel (строки, столбцы, родительский / дочерний элемент и роли)

Например

for (int i = 0; i < 3; ++i) {
    QStandardItem *parent= new QStandardItem("Family " + QString::number(i),this);
    item->setRowCount(3);
    for (int j = 0; j < 3; ++j) {
        QStandardItem *child = new QStandardItem("Child " + QString::number(i*3+j), this);
        parent->setChild(j,child);
    }
    model->appendRow(parent);
}

Отказ от ответственности: это не было скомпилировано ...

Но, как вы видите, вам нужно добавлять дочерние элементы к элементу, а не модель, каждый элемент может содержать иерархию элементов.

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