Перевод относительных координат QTreeWidget к координатам QGraphicsScene

Пытаюсь построить диаграмму в которой объекты QTreeWidget были бы осью координат, а в QGraphicsScene была бы уже сама диаграмма.

Проблема в том, что у меня не получается получить координаты QTreeWidgetItem, так чтобы в QGraphicsScene отрисовываемые объекты находились на одном уровне с QTreeWidgetItem. На рисунке видно, что записи работы и прямоугольники не на одном уровне

QTreeWidget* tree_widget = new QTreeWidget();
tree_widget->setSortingEnabled(false);

QStringList lst;
lst << "Имя" << "Старт" << "Окончание" << "Процент выполнения" << "Состояние";

tree_widget->setHeaderLabels(lst);

QTreeWidgetItem* plan1 = new QTreeWidgetItem(tree_widget);
plan1->setText(0, "ПЛАН_1");
QTreeWidgetItem* tmp1 = new QTreeWidgetItem(plan1);
tmp1->setText(0, "Работы_1");
tmp1->setText(1, "8:30");
tmp1->setText(2, "17:30");
tmp1->setText(3, "7");
tmp1->setText(4, "true");
QTreeWidgetItem* tmp2 = new QTreeWidgetItem(plan1);
tmp2->setText(0, "Работы_2");
tmp2->setText(1, "9:00");
tmp2->setText(2, "00:00");
tmp2->setText(3, "10");
tmp2->setText(4, "true");

tree_widget->setCurrentItem(plan1);

plan1->setExpanded(true);

QHeaderView* h = tree_widget->header();
h->setSectionsMovable(false);
h->setCascadingSectionResizes(false);

auto size_h = h->viewport()->height();

QGraphicsScene* gs = new QGraphicsScene;

QRect viewport_relative_rect1 = tmp1->treeWidget()->visualItemRect(tmp1);
QRect viewport_relative_rect2 = tmp2->treeWidget()->visualItemRect(tmp2);

viewport_relative_rect1.setY(viewport_relative_rect1.y() + size_h);
viewport_relative_rect2.setY(viewport_relative_rect2.y() + size_h);

gs->addRect(viewport_relative_rect1);
gs->addRect(viewport_relative_rect2);

gs->addWidget(tree_widget);

gs->addRect(tree_widget->contentsRect());

QGraphicsView* gv = new QGraphicsView(gs, this);
gv->setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff);

Тут я попытался учесть высоту шапки, но похоже есть ещё некоторые отступы, которые не знаю как получить.

Как корректно перенести координаты внутри виджета на графическую сцену?

Критерием корректности является одинаковое значение координат по y.


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

Автор решения: needKVAS

Вам нужно сначала добавить виджет на сцену и только потом вычислять размеры.

//...
QGraphicsScene* gs = new QGraphicsScene;
gs->addWidget(tree_widget);

auto size_h = h->viewport()->height();

QRect viewport_relative_rect1 = tmp1->treeWidget()->visualItemRect(tmp1);
QRect viewport_relative_rect2 = tmp2->treeWidget()->visualItemRect(tmp2);

viewport_relative_rect1.moveTop(viewport_relative_rect1.y() + size_h);
viewport_relative_rect2.moveTop(viewport_relative_rect2.y() + size_h);

gs->addRect(viewport_relative_rect1);
gs->addRect(viewport_relative_rect2);
//...

Обратите внимание, что нужно использовать moveTop, чтобы изменить положение QRect (setY приводит к изменению высоты).

→ Ссылка