[PyQt5-Node-Editor][基础篇]从零开始使用Pyqt5制作节点编辑器(14)——实现Item删除

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
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值