2014-01-10 5 views
0

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

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

this->scale(factor, factor); 

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

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

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

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

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

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

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

ответ

1

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


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

+0

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

1

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

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

Смежные вопросы