2009-07-09 6 views
2

내 (Py) Qt 응용 프로그램의 QGraphicsView에서 스크롤/팬 기능을 구현하고 싶습니다. 다음과 같이 작동합니다 : 사용자가 가운데 마우스 버튼을 누르면 사용자가 마우스를 움직일 때보기가 스크롤됩니다 (이는 매우 일반적인 기능입니다).
QWidget에서 상속 한 scroll() 메서드를 사용해 보았습니다. 그러나, 어떻게 든 스크롤 막대와 모든 대신보기 이동합니다. 그림을 참조하십시오.
이것이 내가이 일을하기위한 방법이 아니라면 어떻게해야합니까? 아니면 올바른 방법일까요?하지만 그 밖의 뭔가 잘못 됐습니까? 내가 사용하는 코드 :프로그래밍 방식으로 QGraphicsView 스크롤

def __init__(self): 
     ... 

     self.ui.imageArea.mousePressEvent=self.evImagePress 
     self.ui.imageArea.mouseMoveEvent=self.evMouseMove 

     self.scrollOnMove=False 
     self.scrollOrigin=[] 

     ... 

    def evImagePress(self, event): 
     if event.button() == Qt.LeftButton: 
      self.evImageLeftClick(event) 
     if event.button() == Qt.MidButton: 
      self.scrollOnMove=not self.scrollOnMove 
      if self.scrollOnMove: 
       self.scrollOrigin=[event.x(), event.y()] 
    ... 

    def evMouseMove(self, event): 
     if self.scrollOnMove: 
      self.ui.imageArea.scroll(event.x()-self.scrollOrigin[0], 
            event.y()-self.scrollOrigin[1]) 

전체 이동 위젯 비즈니스를 제외하고는 예상대로 작동합니다.

Fails to scroll http://img55.imageshack.us/img55/3222/scrollfail.jpg

+0

어떤 위젯 유형이 self.ui.imageArea입니까? QScrollArea, QGraphicsArea 또는 다른 것입니까? –

+0

오, 텍스트에서 언급하지 않았지만 제목에서. 그것은 QGraphicsView입니다. – carlpett

+0

QGraphicsScene 안에 뷰가 표시하는 QScrollArea가 있습니까? –

답변

3

나 자신이하지 않은 그러나 이것은 QGraphicsView 문서

... 장면이 스크롤 바 '값보다 큰 경우, 당신은 선택할 수 있습니다에서입니다 대신 translate()를 사용하여 씬을 탐색하십시오.

위젯을 이동 scroll를 사용하여 translate 당신이보기 아래에있는 QGraphicsScene의 내용을 이동, 원하는 것을 달성해야

를 QGraphicsView에 표시되는
+0

글쎄, 씬은 스크롤바의 허용 된 값보다 크지 않기 때문에 문제가되지 않습니다. 그러나 나는 번역을 시도 했었지만 이미지의 일부를 앞뒤로 떨게 만들었습니다. 나는 그것이 자동으로 다시 중심에 있다고 생각하니? – carlpett

+0

나는 문서를보고 있는데,'setDragMode (QGraphicsView :: ScrollHandDrag)'를 시도해 본 적이 있고'interactive'의 값이'true'입니까? –

+7

다시 번역해야합니다. view.setTransformationAnchor (QtGui.QGraphicsView.NoAnchor) else translate()는 아무런 기능을하지 못합니다! – denis

0
당신은 QGraphicsScene의 영역을 설정할 수 있습니다

방법은 QGraphicsView::setSceneRect()입니다. 따라서 버튼을 누르고 마우스를 움직이면 장면의 표시된 부분의 중심을 변경하고 목표를 달성 할 수 있습니다.

4

translate() 메소드에 추가되었습니다. 씬을 스케일하지 않으면 훌륭하게 작동합니다. 이렇게하면 이미지가 마우스 움직임과 일치하지 않음을 알 수 있습니다. 그 때 mapToScene()이 도움이됩니다. 마우스 이벤트에서 장면 좌표로 포인트를 매핑해야합니다. 그런 다음 매핑 된 차이가 translate()로 이동하고, 장면이 큰 정확도로 마우스를 따라갑니다. 예를 들어

: 데니스에 의해 주어진

QPointF tmp2 = mapToScene(event->pos()); 
QPointF tmp = tmp2.mapToScene(previous_point); 
translate(tmp.x(),tmp.y()); 
1

답변 일 번역 얻을 맞습니다. PF4Public에 의한 주석도 유효합니다. 이것은 스케일링을 망칠 수 있습니다. 제 해결 방법은 P4FPublc와 다릅니다 - mapToScene 대신에 나는 닻을 보존하고 번역 후에 복원합니다 :

previousAnchor = view.transformationAnchor() 
#have to set this for self.translate() to work. 
view.setTransformationAnchor(QGraphicsView.NoAnchor) 
view.translate(x_diff,y_diff) 
#have to reset the anchor or scaling (zoom) stops working: 
view.setTransformationAnchor(previousAnchor) 
관련 문제