crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

karpoffhome
  опции профиля:
сообщение 18.8.2010, 11:48
Сообщение #1


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 18.8.2010
Пользователь №: 1972

Спасибо сказали: 0 раз(а)




Репутация:   0  


добрый день ...
в общем имею набор данных заключенных в структуре вида QMap<QString,QMap<QString,int>*>. необходимо отразить эти данные в QTreeView. поскольку с Qt сталкиваюсь впервые прошу подсказки какой наиболее предпочтительный способ можно придумать.

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

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

сие реально???
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
2 страниц V   1 2 >  
Начать новую тему
Ответов (1 - 16)
Алексей1153
  опции профиля:
сообщение 18.8.2010, 12:34
Сообщение #2


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


вообще, класс вида

QMap<parent_id,child_id>

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

В твоём случае у тебя всего 2-уровневое дерево
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
karpoffhome
  опции профиля:
сообщение 18.8.2010, 12:57
Сообщение #3


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 18.8.2010
Пользователь №: 1972

Спасибо сказали: 0 раз(а)




Репутация:   0  


как бы да. но я не соображу как эту структуру данных передать QTreeView
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 18.8.2010, 13:20
Сообщение #4


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


её надо не передавать, а прошагать все элементы мапа и добавить их по очереди на свои места в дерево
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 18.8.2010, 13:40
Сообщение #5


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Словарь не годится для создания дерева, это я уже прошёл.
Нужно делать класс на подобие того, что описан в примере "Editable Tree Model" (пример "Simple Tree Model" не смотри, он паршивый)
т.к. нужно хранить информацию о всех детях, плюс данные, особенно если есть данные для разных ролей.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 18.8.2010, 13:54
Сообщение #6


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


У меня есть класс для представления дерева - в нём используется всего один экземпляр std::map<... ,...>

Так что, ещё как годится :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DIMEDROLL
  опции профиля:
сообщение 18.8.2010, 15:15
Сообщение #7


Участник
**

Группа: Участник
Сообщений: 165
Регистрация: 28.9.2008
Из: Киев
Пользователь №: 304

Спасибо сказали: 23 раз(а)




Репутация:   0  


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

А зачем тебе QTreeView? Возможно подойдет QTreeWidget? в него легко передать твою структуру данных
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
karpoffhome
  опции профиля:
сообщение 19.8.2010, 10:20
Сообщение #8


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 18.8.2010
Пользователь №: 1972

Спасибо сказали: 0 раз(а)




Репутация:   0  


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

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


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

пытаюсь сделать следующую штуку: описанная структура содержит данные, которые редактируются, удаляются, добавляются. параметры не меняются, модифицируются лишь связки "значение - эквивалент". хотелось бы найти самый оптимальный по трудозатратам и результатам путь (класс :)
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DIMEDROLL
  опции профиля:
сообщение 19.8.2010, 10:44
Сообщение #9


Участник
**

Группа: Участник
Сообщений: 165
Регистрация: 28.9.2008
Из: Киев
Пользователь №: 304

Спасибо сказали: 23 раз(а)




Репутация:   0  


ну тогда прийдется вникать в 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
  опции профиля:
сообщение 20.8.2010, 11:06
Сообщение #10


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 18.8.2010
Пользователь №: 1972

Спасибо сказали: 0 раз(а)




Репутация:   0  


подскажите, а есть ли возможность отключить автоматическую сортировку по ключу в QMap
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 20.8.2010, 11:08
Сообщение #11


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


karpoffhome, нету такой возможности - примени другой контейнер ) Например, вектор или список
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 20.8.2010, 11:16
Сообщение #12


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


Цитата(Алексей1153 @ 20.8.2010, 12:08) *
karpoffhome, нету такой возможности - примени другой контейнер ) Например, вектор или список

в stl для этого можно 3 параметр шаблона поменять, можно использовать std::unordered_map/boost::unordered_map, в Qt для этого для ключа нужно переопределить operator <

Сообщение отредактировал DEADHUNT - 20.8.2010, 11:17
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Алексей1153
  опции профиля:
сообщение 20.8.2010, 11:18
Сообщение #13


фрилансер
******

Группа: Участник
Сообщений: 2943
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


DEADHUNT, если сортировать не надо, то зачем хранить как дерево - пущай вектор будет.
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
Litkevich Yuriy
  опции профиля:
сообщение 20.8.2010, 11:33
Сообщение #14


разработчик РЭА
*******

Группа: Сомодератор
Сообщений: 9669
Регистрация: 9.1.2008
Из: Тюмень
Пользователь №: 64

Спасибо сказали: 807 раз(а)




Репутация:   94  


Цитата(karpoffhome @ 20.8.2010, 15:06) *
подскажите, а есть ли возможность отключить автоматическую сортировку по ключу в QMap
нет. Но вместо него можно использовать хэш (QHash), он хранит в том порядке, в котором добавляли
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение
DEADHUNT
  опции профиля:
сообщение 20.8.2010, 11:39
Сообщение #15


Активный участник
***

Группа: Участник
Сообщений: 430
Регистрация: 15.4.2009
Пользователь №: 686

Спасибо сказали: 26 раз(а)




Репутация:   2  


Цитата(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
  опции профиля:
сообщение 24.8.2010, 16:10
Сообщение #16


Новичок


Группа: Новичок
Сообщений: 6
Регистрация: 18.8.2010
Пользователь №: 1972

Спасибо сказали: 0 раз(а)




Репутация:   0  


решил проблему следующим образом:

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
  опции профиля:
сообщение 24.8.2010, 16:24
Сообщение #17


Профессионал
*****

Группа: Сомодератор
Сообщений: 1215
Регистрация: 22.3.2009
Из: Саратов
Пользователь №: 630

Спасибо сказали: 235 раз(а)




Репутация:   29  


void QTreeView::expandAll () [slot]
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

2 страниц V   1 2 >
Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0


RSS Рейтинг@Mail.ru Текстовая версия Сейчас: 29.5.2025, 21:04