Я следую идее в этом посте:
{ ссылка }
где метод 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 .
Это, по крайней мере, идея. Не знаете, как я могу реализовать что-то подобное?