【问题标题】:Pan & Zoom all QWidget children平移和缩放所有 QWidget 子项
【发布时间】:2020-10-31 06:09:16
【问题描述】:

我想要一个可以在其中平移和缩放的 QWidget。

场景:

  • 当用户使用鼠标中键向上/向下滚动时,所有子级都会从小部件的中心进行缩放。
  • 如果用户按住 Alt 并同时按下鼠标中键,则所有子级都将使用鼠标移动的距离进行平移。

这个想法是通过继承另一个 QWidget 来创建一个新的 QWidget。所以我以 QGraphicsView 为例:

更新:

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)

我无法点击按钮。我该如何解决?

【问题讨论】:

标签: python pyside qwidget qtgui paintevent


【解决方案1】:

最后,我只是忘了在我的重写函数上添加一个超级构造函数,例如:

super(MyQGraphicsView, self).mouseMoveEvent(event)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-08
    • 2013-12-12
    • 2016-03-10
    • 2014-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多