Перевод относительных координат 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 шт):
Вам нужно сначала добавить виджет на сцену и только потом вычислять размеры.
//...
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
приводит к изменению высоты).