2014-01-10 2 views
0

QGraphicsView를 서브 클래 싱하여 휠 이벤트를 줌인 및 줌아웃하도록 서브 클래 싱했습니다. 휠 스크롤하면 줌 기능이 잘 작동하고 (내가 원하는 기능 임) graphicsview로 설정되어 현장에있는 항목의 배율 GraphicsView추가 된 QWidget을 축척하지 않고 QGraphicsView 크기를 조정하십시오.

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 플래그를 제거하고 및 그것은 내가 원하는 것을 분명히 아니다 화면 만 변경 크기의 중앙에 완벽하게 남아 축소하는 경우 때문에, 얻을 해달라고

하는 경우 아무도 이것에 약간의 빛을 비출 수 있습니다 나는 어떤 도움을 주셔서 감사합니다

답변

1

IMO QGraphicsView를 만지지 말아야합니다. 가장 좋은 방법은 일부 루트 QGraphicsItem (크기를 조정해야하는 모든 항목의 부모)을 갖는 것입니다.
장면에 비해 스케일이 조정되지 않은 항목 (최상위 부모는 크기 조정되지 않음)과 상위 상위 항목이 마우스 휠 이벤트를 처리하고 크기 조정을 수행하는 항목을 가질 수 있습니다.


실제로 위젯의 원본은 이동하지 않습니다 (동일한 위치에 유지됨). 문제는 뷰의 중심이 스케일링의 중심 일 가능성이 높고 위젯이 왼쪽 위 모서리에서 왼쪽 상단 모퉁이로 연결된다는 것입니다.
문제를 해결하려면 ItemIgnoresTransformations 플래그가있는 항목의 원점이 스케일링의 중심에 위치 할 수 있습니다. 그래서 가중치 QGraphicsItem을 국기의 중심에 ItemIgnoresTransformations과 함께 추가하고 그것을 위젯에 대해 부모로 만듭니다. 대부분 위젯의 위치를 ​​widget.setPos(widget.width()/2, widget.height()/2)으로 설정해야합니다.

+0

크기를 조정해야하는 모든 항목은 QGraphicsItem 그룹에 있지만 항목 자체는 크기를 조정해서는 안되며 항목에 모두 레이아웃되어 있으므로 장면 크기를 조정할 필요가 있습니다. 즉 항목의 크기는 동일하지만 레이아웃의 크기가 조절됩니다. 그들은 마커를 이미지 위에 올려 놓기 때문에 마커가 같은 크기가 되길 원하지만, 확대/축소가 필요하다면 동일한 확대/축소 레벨에서 같은 레이아웃으로 머물러 있어야합니다. – AngryDuck

1

사실 당신이 관찰하는 것은 정상입니다. 항목의 크기를 조정하지 않으면 모든 그래픽보기의 크기가 조정되므로 항목이 "보이는"것으로 번역됩니다.

목표에 도달하는 방법은 위젯을 부모로 사용하여 루트 QGraphicsItem을 정의하는 것일 수 있습니다. 루트 항목의 경계 사각형의 기능에서이 번역 노출을 피하려면 정적 위젯을 다시 중심에두면됩니다.