代码写得深,BUG永相随
目标
选中单个Node后,按delete键,会删除对应node以及他所连接的线,不仅仅是显示效果上删除了,在scene列表里也删除掉了
多选也能进行删除
单独的edge也能删除
实现
修复BUG
在之前的程序里,有个非常致命的BUG,就是对一个socket连续点击两次会导致socket连接自己,最终导致程序崩溃
修复这个BUG很简单
只需要在node_grapgics_view.py里的edgeDragEnd方法中加一个if条件就行
if type(item) is QDMGraphicsSocket:
if item.socket != self.last_start_socket: #新增if
if item.socket.hasEdge():
item.socket.edge.remove()
if self.previousEdge is not None:
self.previousEdge.remove()
self.dragEdge.start_socket = self.last_start_socket
self.dragEdge.end_socket = item.socket
self.dragEdge.start_socket.setConnectedEdge(self.dragEdge)
self.dragEdge.end_socket.setConnectedEdge(self.dragEdge)
self.dragEdge.updatePosition()
return True
这样就不会导致出现一个节点连接自己的情况了
建立delete键触发事件
还是在node_grapgics_view.py中
重写keyPressEvent(self, event)
事件,并且新增属性self.editingFlag
def keyPressEvent(self, event):
if event.key() == Qt.Key_Delete:
if not self.editingFlag:
self.deleteSelected()
else:
super().keyPressEvent(event)
else:
super().keyPressEvent(event)
self.editingFlag = False
其中self.editingFlag是表示是否处于编辑edit模式中,这个后面再说为什么要这么做
最后如果不是del键或者不在edit编辑模式中,都需要继承keyPressEvent,防止其他按键输入失效
而deleteSelected()是定义的新方法
def deleteSelected(self):
for item in self.grScene.selectedItems():
if isinstance(item, Q