2014-12-29 2 views
0

팬을 확대/축소 할 수있는 QWidget을 갖고 싶습니다.팬 & 줌 전체 QWidget 하위

시나리오 :

  • 사용자가 스크롤 업/아래 자신의 마우스 가운데 버튼을 사용하여, 모든 아이들이 위젯의 ​​중심에서 조정됩니다.
  • 사용자가 Alt 키를 누른 채로 마우스 가운데 버튼을 누르면 모든 자식이 마우스로 만들어진 거리를 사용하여 변환됩니다.

다른 아이디어를 서브 클래 싱하여 새로운 QWidget을 만드는 것이 아이디어입니다. 그래서 예를 QGraphicsView와 함께 만든 :

UPDATE :

class MyQGraphicsView(QGraphicsView): 
    def __init__(self): 
     QGraphicsView.__init__(self) 
     self.setFocusPolicy(Qt.WheelFocus) 
     self.setRenderHints(QPainter.Antialiasing) 
     self.altPressed = False 
     self.middlePressed = False 
     self.rightPressed = False 

    def wheelEvent(self, event): 
     self.newScale(event.delta(), 1.15) 

    def keyPressEvent(self, event): 
     if event.key() == Qt.Key_Alt: 
      self.altPressed = True 
      QApplication.setOverrideCursor(Qt.OpenHandCursor) 

    def keyReleaseEvent(self, event): 
     if event.key() == Qt.Key_Alt: 
      self.altPressed = False 
      QApplication.setOverrideCursor(Qt.ArrowCursor) 

    def mousePressEvent(self, event): 
     self._dragPos = event.pos() 
     if event.button() == Qt.MidButton: 
      self.middlePressed = True 
     if event.button() == Qt.RightButton: 
      self.rightPressed = True 

    def mouseReleaseEvent(self, event): 
     if event.button() == Qt.MidButton: 
      self.middlePressed = False 
     if event.button() == Qt.RightButton: 
      self.rightPressed = False 

    def mouseMoveEvent(self, event): 
     if self.altPressed: 
      newPos = event.pos() 

      if self.middlePressed: 
       diff = newPos - self._dragPos 
       self._dragPos = newPos 
       QApplication.setOverrideCursor(Qt.ClosedHandCursor) 
       self.horizontalScrollBar().setValue(self.horizontalScrollBar().value() - diff.x()) 
       self.verticalScrollBar().setValue(self.verticalScrollBar().value() - diff.y()) 
       event.accept() 
      if self.rightPressed: 
       diff = newPos - self._dragPos 
       self._dragPos = newPos 
       QApplication.setOverrideCursor(Qt.SizeAllCursor) 
       self.newScale(diff.x(), 1.01) 

    def newScale(self, operator, factor): 
     if operator > 0: 
      self.scale(factor, factor) 
     if operator < 0: 
      self.scale(1.0/factor, 1.0/factor) 
I는 다음과 같이 사용할 때이 클래스는 패닝 및 줌,하지만 잘 동작

:

view = MyQGraphicsView() 
scene = QGraphicsScene() 
view.setScene(scene) 
view.setSceneRect(0, 0, 1000, 1000) 

button = QPushButton('Hello !') 
button.clicked.connect(self.sayHello) 
scene.addWidget(button) 

I 버튼을 클릭 할 수 없습니다. 어떻게 해결할 수 있습니까?

+0

도 볼 http://stackoverflow.com/questions/19113532/qgraphicsview-zooming-in-and-out -under-mouse-position-using-mouse-wheel – Trilarion

답변

0

마지막으로, 난 그냥 내 오버라이드 기능에 슈퍼 생성자를 추가하는 손실, 예 :

super(MyQGraphicsView, self).mouseMoveEvent(event)