【问题标题】:SVG image stops following mouse cursor on abrupt cursor movementsSVG 图像在光标突然移动时停止跟随鼠标光标
【发布时间】:2020-08-23 12:47:19
【问题描述】:

我正在遵循这篇文章中的想法:

https://stackoverflow.com/a/38860809/2407089

QGraphicsSvgItem 类中的 hoverMoveEvent 方法允许某人通过 self.scenePos 和 self.setPos 在场景中拖动图像。下面的最小工作代码:

import sys
from PyQt5.QtCore import *
from PyQt5.QtSvg import *
from PyQt5.QtWidgets import *

svg_image = 'C:\\dev\\io\SVG\\my_image.svg'


class Image(QGraphicsSvgItem):

    def __init__(self, parent=None):
        super().__init__(svg_image)
        self.parent = parent

        self.setFlags(QGraphicsItem.ItemIsSelectable |
                      QGraphicsItem.ItemIsMovable)

        self.setAcceptHoverEvents(True)

        self.mobile = True  # allows the svg to be dragged around

        self.svgSize = self.renderer().defaultSize()
        self.width = self.svgSize.width()
        self.height = self.svgSize.height()

    def hoverEnterEvent(self, event):
        print('Enter')

    def hoverLeaveEvent(self, event):
        print('Leave')

    def hoverMoveEvent(self, event):
        if self.mobile:  #
            # this is a bit flaky in that the object detaches from mouse if mouse movement is too abrubt..
            self.setPos(event.scenePos() - QPoint(self.width / 2, self.height / 2))
            self.update()

    def mousePressEvent(self, event):
        self.mobile = False  # stop the hover/move behaviour
        super().mousePressEvent(event)


class Viewport(QGraphicsView):
    def __init__(self, parent=None):
        super(Viewport, self).__init__(parent)
        self.scene = QGraphicsScene()
        self.image = Image()
        self.image.setPos(100, 100)
        self.scene.addItem(self.image)
        self.setScene(self.scene)
        self.image.scene = self.scene
        self.image.view = self


class MainWindow(QWidget):
    def __init__(self, parent=None):
        super().__init__(parent)

        self.view = Viewport(self)

        hbox = QHBoxLayout()
        hbox.addWidget(self.view)

        self.setLayout(hbox)


app = QApplication(sys.argv)
window = MainWindow()
window.show()
sys.exit(app.exec_())

这有效,直到用户突然移动鼠标并且光标失去与图像的接触 - 导致不再调用 hoverMoveEvent 并且图像位置不再更新。我希望这个图像拖动功能更加“粘性”,因为当变量“self.mobile”== True 时,hoverMoveEvent 不可能不触发,并且图像位置始终更新,直到 self.mobile 为 False .

至少是这个想法。想知道我怎么能实现这样的东西?

【问题讨论】:

  • 尝试在父级上使用鼠标移动事件

标签: python svg pyqt pyqt5


【解决方案1】:

使鼠标更具粘性的一种方法是将移动项目的责任移动到图形视图而不是项目本身。例如,这样的事情会通过单击一次使场景中的项目移动,而通过再次单击它们使非移动项目:

class Viewport(QGraphicsView):
    def __init__(self, parent=None):
        ...
        self.move_item = None
        self.pos0 = None

    def mousePressEvent(self, event):
        item = self.itemAt(event.pos())
        if self.move_item:
            self.move_item = None
            self.pos0 = None
        else:
            self.move_item = item
            self.pos0 = self.move_item.pos() - self.mapToScene(event.pos())

    def mouseMoveEvent(self, event):
        if self.move_item and self.pos0:
            self.move_item.setPos(self.mapToScene(event.pos()) + self.pos0)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-07-12
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-06-27
    相关资源
    最近更新 更多