Что и как переопределить, для необходимой мне работы QtreeWidget

Сколько гуглил, никак не могу понять, подскажите пожалуйста что и как мне переопределить, чтобы получилось то что я опишу ниже. Возможно нужен QTreeView и переопределение model и selectionmodel, как не пытался понять, не доходит.

В общем нужно мне следующее, дерево, допустим с 4 колонками, в дереве несколько topLevelItem`ов, представляющих из себя просто группы, внутри этих групп списки устройств (допустим deviceitem), deviceitem должны быть связаны с классом устройств (device), device имеет флаг выделения, соответственно надо чтобы при выделении deviceitem в дереве, флаг выделения устанавливался и на device, так же в обратную сторону.

Раньше я это делал, на мой взгляд не совсем правильным подходом и должен быть другой, никаких переопределений не было, у device есть поле id, на все deviceitem->setData(device->id) и потом через selectionrange и сравнением device->id и deviceitem->data выделял, но таким образом, при клике на уже выделенные айтемы в дереве иногда выделение моргало (сбрасывалось и выделялось снова), что резало глаз, к тому же хотелось бы как то связать удаление и изменение device, чтобы при изменении deviceitem изменял свой текст, а при удалении, соответственно удалялся из дерева

Попробую уточнить слева сейчас qtreewidget, справа qgraphicsview

Нужно синхронизовать выделение (зеленая подсветка) между tree и view. Что выделили в дереве, то выделилось в view и наоборот

В view переопределен QGraphicsItem и его метод

QVariant DeviceItem::itemChange(GraphicsItemChange change, const QVariant &value)
{
  if (change == ItemSelectedChange)
    the_device_->SetSelectedFlag(value.toBool());  

  return QGraphicsItem::itemChange(change, value);
}

в котором устанавливается флаг в device, соответственно нужно чтобы дерево тоже могло устанавливать этот флаг при выделении айтема, чтобы каждый айтем был связан с указателем на device (как и переопределенный qgraphicsitem), чтобы допустим при изменении адреса он просто обновлял данные из колонки address, все это еще и с учтом того, что device может бытьв нескольких группах, то есть несколько айтемов.
В общем хотелось бы примерно чтобы в QTreeWidgetItem был такой же метод как и в QGraphicsItem, itemChange, в котором при выделении флаг устанавливался в device

И еще, подскажите пожалуйста, как сделать чтобы при выделении группы, выделялось все содержимое но не сама группа?


Ответы (1 шт):

Автор решения: Alexander Chernin

Общая схема связи классов представлена на Диаграмме Классов (надеюсь все понятно):

введите сюда описание изображения

Здесь центральный класс это DeviceModel, в котором есть список объектов типа DeviceGroup, каждый из которых содержит те самые объекты устройств Device

Один и тот же объект класса DeviceModel используется и в DeviceTreeView (наследник QTreeView) и DeviceScene (QGraphicsScene), который содержит объекты DeviceGraphicsItem (наследует QObject для сигналов и QGraphicsEllipseItem для отображения на QGraphicsView в виде кружочков)

Далее, при помощи сигналов и слотов все это связывается в двустороннюю связь, то есть выделение устройства в дереве (я сделал двойным кликом), выделяет устройство (изменяет его свойство selected), что отображается и в дереве и на сцене. И в обратную сторону, выделение устройства на сцене приводит к выделению его в дереве.

Основные коннекты находятся в MainWindow.

Демо код находится в этом репозе

→ Ссылка