2014-12-29 4 views
0

Я хотел бы иметь QWidget, который имеет возможность панорамирования и масштабирования внутри него.Pan & Zoom все дети 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) 

I не можете нажимать на кнопку. Как я могу это решить?

+0

смотри также http://stackoverflow.com/questions/19113532/qgraphicsview-zooming-in-and-out -Под-мышь-позиционный с помощью мыши колеса – Trilarion

ответ

0

Наконец, я просто потерял добавить супер-конструктор на моей перекрытой функций, например:

super(MyQGraphicsView, self).mouseMoveEvent(event) 

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

  • Нет связанных вопросов^_^