2014-12-29 52 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) 

,当我使用这样的此类工作正常平移和缩放,但是:

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

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

我不能点击按钮。我该如何解决它?

+0

也看到http://stackoverflow.com/questions/19113532/qgraphicsview-zooming-in-and-out - 下层 - - 小鼠位置使用鼠标轮 – Trilarion

回答

0

最后,我只是失去了对我的overrided功能添加一个超级构造函数,例如:

super(MyQGraphicsView, self).mouseMoveEvent(event)