QAbstractItemModel с конкретной структурой
От: Homunculus Россия  
Дата: 04.11.19 18:58
Оценка:
У меня есть модель дерева для QTreeView.
Все нормально работает, грузится, отоброжается, сохраняется.

Но некоторые поддеревья моих моделей имеют вполне конкретную известную структуру и элементы.

Как бы отнаследоваться еще раз от моих ппрелпределенных QAbstractItem, чтоб уже работать с железно известной структурой для быстрого доступа к листьям дерева?
Re: QAbstractItemModel с конкретной структурой
От: Igore Россия  
Дата: 05.11.19 07:20
Оценка:
Здравствуйте, Homunculus, Вы писали:

H>У меня есть модель дерева для QTreeView.

H>Все нормально работает, грузится, отоброжается, сохраняется.

H>Но некоторые поддеревья моих моделей имеют вполне конкретную известную структуру и элементы.


H>Как бы отнаследоваться еще раз от моих ппрелпределенных QAbstractItem,

H>чтоб уже работать с железно известной структурой для быстрого доступа к листьям дерева?
Чтобы работать где? Внутри модели ты и так можешь работать со своей стуктурой, а во вне, ну сделай что на model.data(index, Qt::UserRole) возвращается твоя структура, если мало заведи несколько таких ролей, и просто у модели добавь публичный метод, getRealStructure(?)
Re[2]: QAbstractItemModel с конкретной структурой
От: Homunculus Россия  
Дата: 05.11.19 07:31
Оценка:
Здравствуйте, Igore, Вы писали:

I>Чтобы работать где? Внутри модели ты и так можешь работать со своей стуктурой, а во вне, ну сделай что на model.data(index, Qt::UserRole) возвращается твоя структура, если мало заведи несколько таких ролей, и просто у модели добавь публичный метод, getRealStructure(?)


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

То есть понятно, что я могу получить доступ к чему угодно через запросы типа item->getChild("name1")->getChild("name2")
Это понятно. Но например, у меня фиксирована структура с тремя числами и названиями этих чисел. Например, точка и ее координаты.
Ясно что я могу получить доступ к ним через например

item->getChild("point")->getChild("X")->getValue()


но хотелось типа такого доступа

Point* pnt = item->getChild("point");
float x = pnt->getX();

хотя эта самая pnt->getX() внутри себя будет все равно делать getChild("X")->getValue()

Хочется просто такой класс-обертку, для более красивого доступа к элементам. Как такое провернуть?

Криво объясняю?
Re[3]: QAbstractItemModel с конкретной структурой
От: Igore Россия  
Дата: 05.11.19 08:18
Оценка: 6 (1)
Здравствуйте, Homunculus, Вы писали:

H>Хочется просто такой класс-обертку, для более красивого доступа к элементам. Как такое провернуть?

Можно и через отдельный класс сделать, просто бери и пиши, запрос данных через data и создание твоих структур на лету, но ИМХО лучше сразу идти за данными модели

H>Криво объясняю?

Есть немного, у тебя внутри модели что и как хранится? Я предлагаю 3 варианта, не через отдельную обертку а через текущую модель
1) QAbstractItemModel::createIndex + QModelIndex::internalPointer, сохранять и считывать указатель на данные внутренней стуктуры
2) data(index, Qt::UserRole), Qt::UserRole +1, +2, ..., запрашивать через пользовательские роли data конкретные структуры
enum MyRoles{
    Point = Qt::UserRole,
    WhatEver,
    Another
}
auto point = model->data(index, MyRoles::Point).toPoint();
auto myClass = qvariant_cast<WhatEverClass>( model->data(index, MyRoles::WhatEver) );

3) Заведи в модели свои методы которые будут возвращать то что тебе нужно, не совсем понятно что на вход будет приходить, индексы или тебе что-то поудобней можно придумать
QPoint MyModel::getPoint(index?)
{
    return data[?].point;
}
Re[4]: QAbstractItemModel с конкретной структурой
От: Homunculus Россия  
Дата: 05.11.19 08:44
Оценка:
Здравствуйте, Igore, Вы писали:

А, врубился. Через роли, точно. Спасибо!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.