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

本文介绍如何在PyQt5中创建节点编辑器并实现删除功能。通过修复关键的BUG,确保在删除节点时连同其连接的线一并移除。在删除过程中遇到的问题包括节点自我连接导致的崩溃、多选删除时的异常,以及编辑模式下误删节点等。文章详细阐述了每个问题的解决方案,涉及关键方法如edgeDragEnd、keyPressEvent、remove方法等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值