之前照着PyQt5的节点编辑器教程做,发现在重载QGraphicsView里面的鼠标事件以后节点不能被拖动了,尝试了N遍以后终于找到了一点蛛丝马迹
首先,在QGraphicsView自定义类里面添加
# 设置拖拽模式
self.setDragMode(self.RubberBandDrag)#QRubberBand ScrollHandDrag RubberBandDrag
self.setAcceptDrops(True)
其中设置拖拽模式是关键,下面是我的事件函数
def mousePressEvent(self, event:QMouseEvent):
#调度Qt的mousePress事件到相应的函数如下
if event.button() == Qt.MiddleButton:
pass
#self.middleMouseButtonPress(event)
elif event.button() == Qt.LeftButton:
self.leftMouseButtonPress(event)
elif event.button() == Qt.RightButton:
self.rightMouseButtonPress(event)
pass
else:
super().mousePressEvent(event)
def mouseReleaseEvent(self, event:QMouseEvent):
#将Qt的mouserrelease事件分派到下面相应的函数
if event.button() == Qt.MiddleButton:
pass
#self.middleMouseButtonRelease(event)
elif event.button() == Qt.LeftButton:
self.leftMouseButtonRelease(event)
elif event.button() == Qt.RightButton:
self.rightMouseButtonRelease(event)
pass
else:
super().mouseReleaseEvent(event)
def leftMouseButtonPress(self, event:QMouseEvent):
"""当鼠标左键被按下时"""
# 获取我们点击的项目
print(event.buttons().__int__())
self.setDragMode(self.RubberBandDrag)
item = self.getItemAtClick(event)
if isinstance(item, QGraphicsProxyWidget):
print("当鼠标左键被按下时")
self.setDragMode(self.ScrollHandDrag)
releaseEvent = QMouseEvent(QEvent.MouseButtonRelease, event.localPos(), event.screenPos(),
Qt.LeftButton, Qt.NoButton, event.modifiers())
super().mouseReleaseEvent(releaseEvent)
fakeEvent = QMouseEvent(event.type(), event.localPos(), event.screenPos(),
Qt.LeftButton, event.buttons() | Qt.LeftButton, event.modifiers())
super().mousePressEvent(fakeEvent)
return
super().mousePressEvent(event)
def leftMouseButtonRelease(self, event:QMouseEvent):
"""当鼠标左键被释放"""
# 获取我们点击的项目
item = self.getItemAtClick(event)
if isinstance(item, QGraphicsProxyWidget):
print("当鼠标左键被释放")
super().mouseReleaseEvent(event)
return
super().mouseReleaseEvent(event)
def rightMouseButtonPress(self, event:QMouseEvent):
"""当鼠标右键被按下"""
print("当鼠标右键被按下")
self.setDragMode(QGraphicsView.ScrollHandDrag)
fakeEvent = QMouseEvent(event.type(), event.localPos(), event.screenPos(),
Qt.LeftButton, event.buttons() | Qt.LeftButton, event.modifiers())
super().mousePressEvent(fakeEvent)
def rightMouseButtonRelease(self, event:QMouseEvent):
"""当鼠标右键被释放"""
print("当鼠标右键被释放")
print(event.buttons().__int__())
super().mouseReleaseEvent(event)
self.setDragMode(QGraphicsView.RubberBandDrag)
def getItemAtClick(self, event:QEvent) -> 'QGraphicsItem':
"""返回我们点击/释放鼠标按钮的对象
"""
pos = event.pos()
obj = self.itemAt(pos)
return obj
我们使用QMouseEvent来构造一个event事件,这里简单解释一下
type,pos,globalPos,button,buttons,modifiers
其中button表示当前按下的键
buttons表示当前按下的所有键,比如同时按下鼠标左右键
上面这俩分别是Qt.MouseButton,Qt.MouseButtons 感兴趣可以自己百度查一下
原本,我们需要鼠标左键才能拖动视口,现在构造了一下事件,让我们鼠标右键也能拖动窗口了。
这里就会出现一个问题,右键拖动视口以后,鼠标左键无法移动节点。
原因可能是拖拽模式导致的,重点看"""当鼠标左键被按下时"""函数里面的写法。
当我们检测到节点时,先修改成拖拽模式,然后调用松开事件释放一下鼠标,最后调用按下事件
我也没彻底搞懂,可以根据上述作为突破口来解决问题。
|