【发布时间】: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 .
至少是这个想法。想知道我怎么能实现这样的东西?
【问题讨论】:
-
尝试在父级上使用鼠标移动事件