qt GraphicsView 滞后/延迟鼠标事件

问题描述 投票:0回答:1

嗨,我正在尝试在 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 对缩放没有影响。我做错了什么 - 请帮忙。 谢谢你。

qt pyqt
1个回答
0
投票

最终使用 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)
© www.soinside.com 2019 - 2024. All rights reserved.