【发布时间】: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_())
如果需要,用PySide2 或PyQt5 替换qtpy。为了启用翻译,您首先必须使用鼠标滚轮滚动。然后你尝试拖动你可以看到,虽然仿射变换矩阵正在改变,但视图没有平移。
【问题讨论】: