Изображение SVG перестает следовать за курсором мыши при резких движениях курсора - PullRequest
0 голосов
/ 08 мая 2020

Я следую идее в этом посте:

{ ссылка }

где метод hoverMoveEvent в классе QGraphicsSvgItem позволяет кому-то перетаскивать изображение вокруг scene, через 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 .

Это, по крайней мере, идея. Не знаете, как я могу реализовать что-то подобное?

1 Ответ

2 голосов
/ 08 мая 2020

Один из способов сделать мышь более «липкой» - это перенести ответственность за перемещение элементов в графическое представление вместо самих элементов. Например, что-то подобное сделало бы элемент в сцене мобильным, щелкнув по нему один раз, и немобильным, щелкнув по нему второй раз:

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...