【问题标题】:PyQt/PySide QGraphicsView cannot be translatedPyQt/PySide QGraphicsView 无法翻译
【发布时间】:2018-05-13 17:59:42
【问题描述】:

我想继承一个 Python-Qt QGraphicsView 对象来显示一些图像,并且我希望能够通过鼠标拖动进行平移。但是,QGraphicsView.translate(x,y)QGraphicsView.CenterOn(x,y) 方法不起作用。这是一个简单的示例代码片段(为简单起见,我省略了mouseMoveEvent):

import sys
from qtpy import QtGui, QtCore, QtWidgets

class MyView(QtWidgets.QGraphicsView):
    def __init__(self):
        QtWidgets.QGraphicsView.__init__(self)

        self.scene = QtWidgets.QGraphicsScene(self)
        self.item = QtWidgets.QGraphicsEllipseItem(-20, -10, 160, 160)
        self.scene.addItem(self.item)
        self.setScene(self.scene)
        self._drag = False
        self._pos = QtCore.QPointF(0.0, 0.0)

    def wheelEvent(self, event):
        if event.angleDelta().y() > 0:
            self.scale(1.5,1.5)   # Increase zoom
        else:
            self.scale(0.75,0.75) # Decrease zoom

    def mousePressEvent(self, event):
        self._drag = True
        self._pos = event.pos()

    def mouseReleaseEvent(self, event):
        if self._drag:
            self._drag = False
            newPos = event.pos()
            delta = self._pos - newPos
            # What the docs say work to translate:
            self.translate( delta.x(), delta.y() )

            aff = self.transform()
            print( 'isTranslating: {}, dx: {}, dy: {}'.format(aff.isTranslating(), aff.dx(), aff.dy()) )
            print( 'hozScroll: {}, vertScroll: {}'.format( self.horizontalScrollBar().value(), self.verticalScrollBar().value() ) )


if __name__ == '__main__':
    app = QtWidgets.QApplication(sys.argv)
    view = MyView()
    view.show()
    sys.exit(app.exec_())

如果需要,用PySide2PyQt5 替换qtpy。为了启用翻译,您首先必须使用鼠标滚轮滚动。然后你尝试拖动你可以看到,虽然仿射变换矩阵正在改变,但视图没有平移。

【问题讨论】:

标签: python qt pyqt pyside


【解决方案1】:

因为QGraphicsView:

http://pyside.github.io/docs/pyside/PySide/QtGui/QGraphicsView.html

是 QAbstractScrollArea 的子类:

http://pyside.github.io/docs/pyside/PySide/QtGui/QAbstractScrollArea.html

QGraphicsView.translate() 确实移动了场景,但随后调用了父类并且连接到滚动条的信号将场景移回滚动条指示的位置。一种解决方案是关闭滚动条信号:

self.setVerticalScrollBarPolicy( QtCore.Qt.ScrollBarAlwaysOff )
self.setHorizontalScrollBarPolicy( QtCore.Qt.ScrollBarAlwaysOff )
self.horizontalScrollBar().disconnect()
self.verticalScrollBar().disconnect()

如果你想保留滚动条,你必须直接设置它们:

self.horizontalScrollBar().setValue( self.horizontalScrollBar().value() + delta.x() )
self.verticalScrollBar().setValue( self.verticalScrollBar().value() + delta.y() )

或者您可以重新探测进入它们的信号/插槽。

【讨论】:

  • 在 PySide2 上需要添加 self 作为参数:self.horizontalScrollBar().disconnect(self)self.verticalScrollBar().disconnect(self)
猜你喜欢
  • 2019-02-01
  • 2015-12-25
  • 1970-01-01
  • 2011-04-01
  • 2017-02-16
  • 2011-11-11
  • 1970-01-01
  • 2021-06-18
  • 1970-01-01
相关资源
最近更新 更多