Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: коим образом QMap<> представить как модель для QTreeView
Форум на CrossPlatform.RU > Библиотеки > Qt > Qt Модель/Представление
karpoffhome
добрый день ...
в общем имею набор данных заключенных в структуре вида QMap<QString,QMap<QString,int>*>. необходимо отразить эти данные в QTreeView. поскольку с Qt сталкиваюсь впервые прошу подсказки какой наиболее предпочтительный способ можно придумать.

вид отображения соответственно:

|- некий параметр
| |- значение - эквивалент
| |- значение - эквивалент
| `- значение - эквивалент
`- и еще параметр
|- значение - эквивалент
|- значение - эквивалент
`- значение - эквивалент

сие реально???
Алексей1153
вообще, класс вида

QMap<parent_id,child_id>

как раз и применяется для хранения дерева

В твоём случае у тебя всего 2-уровневое дерево
karpoffhome
как бы да. но я не соображу как эту структуру данных передать QTreeView
Алексей1153
её надо не передавать, а прошагать все элементы мапа и добавить их по очереди на свои места в дерево
Litkevich Yuriy
Словарь не годится для создания дерева, это я уже прошёл.
Нужно делать класс на подобие того, что описан в примере "Editable Tree Model" (пример "Simple Tree Model" не смотри, он паршивый)
т.к. нужно хранить информацию о всех детях, плюс данные, особенно если есть данные для разных ролей.
Алексей1153
У меня есть класс для представления дерева - в нём используется всего один экземпляр std::map<... ,...>

Так что, ещё как годится :)
DIMEDROLL
Цитата(karpoffhome @ 18.8.2010, 12:57) *
как бы да. но я не соображу как эту структуру данных передать QTreeView

А зачем тебе QTreeView? Возможно подойдет QTreeWidget? в него легко передать твою структуру данных
karpoffhome
Цитата(DIMEDROLL @ 18.8.2010, 16:15) *
Цитата(karpoffhome @ 18.8.2010, 12:57) *
как бы да. но я не соображу как эту структуру данных передать QTreeView

А зачем тебе QTreeView? Возможно подойдет QTreeWidget? в него легко передать твою структуру данных


в классах пока не особо хорошо разбираюсь :)

пытаюсь сделать следующую штуку: описанная структура содержит данные, которые редактируются, удаляются, добавляются. параметры не меняются, модифицируются лишь связки "значение - эквивалент". хотелось бы найти самый оптимальный по трудозатратам и результатам путь (класс :)
DIMEDROLL
ну тогда прийдется вникать в Model/View Programming,
самым простым вариантом, имхо, является использование связки QStandardItemModel\QTreeView, наследоваться от QTreeView и реализовать добавление, удаление, редактирование. Смотри в ассистанте доку по QStandardItemModel:
Цитата
An example usage of QStandardItemModel to create a tree:

 QStandardItemModel model;
QStandardItem *parentItem = model.invisibleRootItem();
for (int i = 0; i < 4; ++i) {
     QStandardItem *item = new QStandardItem(QString("item %0").arg(i));
     parentItem->appendRow(item);
     parentItem = item;
}
karpoffhome
подскажите, а есть ли возможность отключить автоматическую сортировку по ключу в QMap
Алексей1153
karpoffhome, нету такой возможности - примени другой контейнер ) Например, вектор или список
DEADHUNT
Цитата(Алексей1153 @ 20.8.2010, 12:08) *
karpoffhome, нету такой возможности - примени другой контейнер ) Например, вектор или список

в stl для этого можно 3 параметр шаблона поменять, можно использовать std::unordered_map/boost::unordered_map, в Qt для этого для ключа нужно переопределить operator <
Алексей1153
DEADHUNT, если сортировать не надо, то зачем хранить как дерево - пущай вектор будет.
Litkevich Yuriy
Цитата(karpoffhome @ 20.8.2010, 15:06) *
подскажите, а есть ли возможность отключить автоматическую сортировку по ключу в QMap
нет. Но вместо него можно использовать хэш (QHash), он хранит в том порядке, в котором добавляли
DEADHUNT
Цитата(Litkevich Yuriy @ 20.8.2010, 12:33) *
нет. Но вместо него можно использовать хэш (QHash), он хранит в том порядке, в котором добавляли

QHash is unordered, so an iterator's sequence cannot be assumed to be predictable. If ordering by key is required, use a QMap.
хэш таблица не сохраняет порядок.
karpoffhome
решил проблему следующим образом:

CODE

QStandardItemModel * paramList;
int iRow = 0;
QStandardItem * rootItem = paramList->invisibleRootItem();
QMap<QString,QMap<QString,int>*>::const_iterator i;
for (i = mapParamList->constBegin();i != mapParamList->constEnd();++i) {
int jRow = 0;
QStandardItem * paramItem = new QStandardItem(mapParamName->value(i.key()));
QMap<QString,int>::const_iterator j;
for (j = mapParamList->value(i.key())->constBegin();j != mapParamList->value(i.key())->constEnd();++j) {
QStandardItem * keyItem = new QStandardItem(j.key());
QStandardItem * valueItem = new QStandardItem(QString().setNum(j.value()));
paramItem->setChild(jRow,0,keyItem);
paramItem->setChild(jRow,1,valueItem);
jRow++;
}
rootItem->setChild(iRow,0,paramItem);
iRow++;
}


теперь возник следующий вопрос, возможно ли сделать так чтобы все отображалось в развернутом дереве, а то все свернутое и жутко не удобное.
igor_bogomolov
void QTreeView::expandAll () [slot]
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Форум IP.Board © 2001-2024 IPS, Inc.