Масштабирование 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 и увеличивать и уменьшать масштаб, он остается точно в центре экрана, но меняет размер, что, очевидно, не то, что я хочу.

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


person AngryDuck    schedule 10.01.2014    source источник


Ответы (2)


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

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

person epsilon    schedule 10.01.2014

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


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

person Marek R    schedule 10.01.2014
comment
Все, что нужно масштабировать, находится в группе QGraphicsItem, однако сами элементы не должны масштабироваться, они все расположены на сцене, и я просто хочу масштабировать сцену, т.е. элементы остаются того же размера, но их макет масштабируется. Это маркеры на изображении, поэтому я хочу, чтобы маркер был одинакового размера, но сцена должна масштабироваться по мере ее увеличения, иначе все они просто остаются в одном макете для одного и того же уровня масштабирования, имеет смысл? - person AngryDuck; 10.01.2014