Масштабировать QGraphicsView без масштабирования добавленного в него QWidget

Я вложил в класс QGraphicsView несколько событий колесика, которые увеличивают и уменьшают его. Когда колесо прокручивается, вызывается функция масштабирования, которая масштабирует GraphicsView.

if(zoom_in)
{
factor = 2.0;
}
else
{
factor = 0.5;
}

this->scale(factor, factor);

Это работает нормально и масштабирует элементы, находящиеся на сцене, которые настроены на графическое представление (что является функциональностью, которую я хочу).

Однако у меня также есть QWidget, добавленный к этой сцене. Виджет должен в основном быть фоном QGraphicsView, он имеет те же размеры и изменяет размеры, чтобы соответствовать представлению всякий раз, когда вид изменяется.

Я знаю, что вы можете установить игнорировать переводы и сделали это

proxyWidget = this->scene()->addWidget(myBackgroundWidget);
proxyWidget->setFlag(QGraphicsItem::ItemIgnoresTransformations);

поэтому, когда представление масштабируется, виджет не меняет размер, что является правильным, но он почему-то перемещается, он перемещается вверх и влево при увеличении и уменьшении и вправо при уменьшении.

Я не понимаю, почему это происходит вообще, потому что если просто удалить ItemIgnoresTransformations помечайте и увеличивайте и уменьшайте масштаб, он остается идеально в центре экрана, но изменяет размер, что явно не то, что я хочу

Если кто-то может пролить свет на это, я был бы признателен за любую помощь

0

Решение

На самом деле то, что вы наблюдаете, это нормально. Если вы не масштабируете элемент, он будет «казаться» переведенным, потому что масштабируется весь графический вид.

Способ достижения вашей цели может состоять в том, чтобы определить корневой QGraphicsItem, с вашим виджетом, связанным с ним. В функции ограничивающего прямоугольника корневого элемента вам просто нужно перецентрировать статический виджет в нем, чтобы избежать этого впечатления от перевода.

1

Другие решения

ИМО не стоит трогать QGraphicsView. Лучший способ — это иметь некоторый корневой QGraphicsItem (родительский элемент для всех элементов, которые должны быть масштабированы).
В сцене могут быть элементы, которые не масштабируются (верхний родительский элемент не масштабируется), а также элементы, верхний родительский элемент которых обрабатывает события колеса мыши и выполняет масштабирование.


На самом деле происхождение вашего виджета не перемещается (остается на той же позиции).
Проблема в том, что центр зрения, скорее всего, является центром масштабирования, а ваш виджет прикреплен его верхним левым углом к ​​верхнему левому углу.
Таким образом, чтобы решить проблему, вы можете установить происхождение элемента с флагом ItemIgnoresTransformations находится в центре масштабирования. Так что добавьте поддельный QGraphicsItem с флагом ItemIgnoresTransformations в центре масштабирования и сделать его родительским для вашего виджета. Скорее всего, вы должны установить положение виджета: widget.setPos(widget.width()/2, widget.height()/2),

1

По вопросам рекламы [email protected]