python - 平移和缩放所有 QWidget 子项

标签 python pyside qwidget qtgui paintevent

我想要一个可以在其中平移和缩放的 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)

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

最佳答案

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

super(MyQGraphicsView, self).mouseMoveEvent(event)

关于python - 平移和缩放所有 QWidget 子项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27682450/

相关文章:

python - 如何使用线程/多处理来防止程序挂起?

python - 创建围绕零镜像的数字列表(python)

python - Tkinter 无法将标签附加到列表中?

python - 线程应用程序的信号量同步失败,Python

c++ - QHBoxLayout间距

python - QHBoxLayout(大小、调整大小、移动)

python - PyQt5 QWidget 将固定宽度设置为最小可用尺寸

python - Vim-plug 插件管理器无法在 YouCompleteMe 插件上使用更新后 Hook

python - python 中 MIDIUtil 中的乐器列表是什么?

python - 如何访问 QTreeWidget 中当前的 QComboBox 数据