У меня есть модель дерева для QTreeView.
Все нормально работает, грузится, отоброжается, сохраняется.
Но некоторые поддеревья моих моделей имеют вполне конкретную известную структуру и элементы.
Как бы отнаследоваться еще раз от моих ппрелпределенных QAbstractItem, чтоб уже работать с железно известной структурой для быстрого доступа к листьям дерева?
Здравствуйте, Homunculus, Вы писали:
H>У меня есть модель дерева для QTreeView. H>Все нормально работает, грузится, отоброжается, сохраняется.
H>Но некоторые поддеревья моих моделей имеют вполне конкретную известную структуру и элементы.
H>Как бы отнаследоваться еще раз от моих ппрелпределенных QAbstractItem, H>чтоб уже работать с железно известной структурой для быстрого доступа к листьям дерева?
Чтобы работать где? Внутри модели ты и так можешь работать со своей стуктурой, а во вне, ну сделай что на model.data(index, Qt::UserRole) возвращается твоя структура, если мало заведи несколько таких ролей, и просто у модели добавь публичный метод, getRealStructure(?)
Здравствуйте, 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()
Хочется просто такой класс-обертку, для более красивого доступа к элементам. Как такое провернуть?
Здравствуйте, 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) Заведи в модели свои методы которые будут возвращать то что тебе нужно, не совсем понятно что на вход будет приходить, индексы или тебе что-то поудобней можно придумать