嗨,我正在尝试在 QGravicsView 的帮助下制作图像查看器,我可以使用鼠标中键和右键缩放和移动图像。
from PyQt5 import QtWidgets, QtCore, QtGui, Qt
import os, re, time, sys
class GraphicsView(QtWidgets.QGraphicsView):
def __init__(self):
super(GraphicsView, self).__init__()
self.middle_pressed = False
self.right_pressed = False
self.moving_pos = QtCore.QRectF()
self.pressed_pos = QtCore.QRectF()
self.width = self.width()
self.scale_view = 1.0
self.setTransformationAnchor(QtWidgets.QGraphicsView.NoAnchor)
self.setResizeAnchor(QtWidgets.QGraphicsView.NoAnchor)
self.setVerticalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.setHorizontalScrollBarPolicy(QtCore.Qt.ScrollBarAlwaysOff)
self.horizontalScrollBar().disconnect()
self.verticalScrollBar().disconnect()
def mouseMoveEvent(self, event):
time.sleep(0.01)
self.moving_pos = event.pos()
if event.buttons() == QtCore.Qt.MiddleButton:
self._scale()
if event.buttons() == QtCore.Qt.RightButton:
self._translate()
def mousePressEvent(self, event):
self.pressed_pos = event.pos()
def _scale(self):
length = self.moving_pos.manhattanLength() - self.pressed_pos.manhattanLength()
self.scale_view = 1.0 + length / self.width
self.centerOn(self.pressed_pos)
self.scale(self.scale_view, self.scale_view)
def _translate(self):
delta = (self.moving_pos - self.pressed_pos)*0.1
self.translate(delta.x(), delta.y())
class GraphicsScene(QtWidgets.QGraphicsScene):
def __init__(self):
super(GraphicsScene, self).__init__()
def load_media():
media_path, _ = QtWidgets.QFileDialog.getOpenFileName(None, 'Open file',
'c:\\',"Image files (*.jpg *.png *.exr)")
print(os.path.abspath(media_path))
return os.path.abspath(media_path)
app = QtWidgets.QApplication(sys.argv)
pixmap_object = QtGui.QPixmap()
pixmap_object.load(load_media())
pixmap_item = QtWidgets.QGraphicsPixmapItem()
pixmap_item.setPixmap(pixmap_object)
scene = GraphicsScene()
scene.setSceneRect(QtCore.QRectF(pixmap_item.pixmap().rect()))
scene.addItem(pixmap_item)
viewer = GraphicsView()
viewer.setScene(scene)
viewer.show()
app.exec()
除了缩放和移动感觉滞后/延迟之外,一切似乎都正常 - 基本上与移动不同步。另外,看起来锚点和 centerOn 对缩放没有影响。我做错了什么 - 请帮忙。 谢谢你。
最终使用 pixmapItem - 在我的情况下更直观和可用:
from PyQt5 import QtWidgets, QtCore
class GraphicsPixmapItem(QtWidgets.QGraphicsPixmapItem):
def __init__(self, _type):
super(GraphicsPixmapItem, self).__init__()
self.moving_pos = QtCore.QRectF()
self.pressed_pos = QtCore.QRectF()
self.scale_factor = self.scale()
self.setData(0, _type)
def mouseMoveEvent(self, event):
self.moving_pos = event.pos()
if event.buttons() == QtCore.Qt.MiddleButton:
self._scale()
if event.buttons() == QtCore.Qt.RightButton:
self._translate()
def mousePressEvent(self, event):
self.pressed_pos = event.pos()
self.scale_factor = self.scale()
def _scale(self):
width = self.boundingRect().size().width()
self.setTransformOriginPoint(self.pressed_pos)
delta = (self.moving_pos.manhattanLength() - self.pressed_pos.manhattanLength()) / width
if self.moving_pos.x() > 0 and self.moving_pos.y() > 0:
scale = self.scale_factor + delta
if scale > 1.0:
self.setScale(scale)
def _translate(self):
delta = (self.moving_pos - self.pressed_pos)
self.setPos(self.pos() + delta)