在这里插入图片描述在 PyQtNode Editor 的开发之旅中,经过前两篇博客对基础环境搭建和核心类结构的探索,我们已经迈出了坚实的步伐。今天,我们将聚焦于node_scene文件,深入解析其中的代码逻辑。这段代码构建了Scene类,它如同整个节点编辑器的 “管理中枢”,承担着组织和协调节点、边等关键元素的重要职责,是推动编辑器功能运转的核心力量。
首先创建一个node_scene.py文件
导入必要的模块​

from node_graphics_scene import QDMGraphicsScene​


这里从自定义模块 node_graphics_scene 中导入 QDMGraphicsScene 类。QDMGraphicsScene 类通常用于处理图形场景的可视化相关操作,比如绘制背景、管理场景中的图形元素显示等。通过导入这个类,Scene 类可以利用它来实现节点和边在界面上的展示,将逻辑数据与可视化效果进行关联。​
定义 Scene 类​

class Scene:


Scene 类用于管理节点编辑器中的节点和边的逻辑数据,以及与图形场景进行交互。它是整个节点编辑系统中数据管理和协调的核心部分,后续关于节点和边的创建、删除、存储等操作都会围绕这个类展开。​
类的初始化方法​

    def __init__(self):​self.nodes = []​self.edges = []​
​self.scene_width = 64000​self.scene_height = 64000​
​self.initUI()


self.nodes = [] 和 self.edges = []:分别创建了两个空列表,用于存储节点和边的对象。在后续的操作中,当创建新的节点或边时,就会将它们添加到对应的列表中,方便进行统一管理和遍历操作 。​
self.scene_width = 64000 和 self.scene_height = 64000:设置了图形场景的宽度和高度。这两个属性定义了整个节点编辑区域的大小范围,确定了节点和边可以放置的空间。​
self.initUI():调用自定义的 initUI 方法,用于初始化与图形场景相关的设置,将逻辑上的 Scene 类与可视化的图形场景进行关联和配置。​
初始化用户界面方法​

    def initUI(self):​self.grScene = QDMGraphicsScene(self)​self.grScene.setGrScene(self.scene_width, self.scene_height)​
​

self.grScene = QDMGraphicsScene(self):创建了一个 QDMGraphicsScene 类的实例 grScene,并将当前的 Scene 类实例(self)作为参数传递进去。这样做是为了在 QDMGraphicsScene 类中能够获取到与当前逻辑场景相关的信息,实现逻辑与可视化的交互。例如,QDMGraphicsScene 类可能需要根据 Scene 类中的数据来决定如何绘制节点和边。​
self.grScene.setGrScene(self.scene_width, self.scene_height):调用 QDMGraphicsScene 实例的 setGrScene 方法,将之前设置的场景宽度和高度传递进去。这个方法可能会根据传入的尺寸对图形场景进行初始化配置,比如设置场景的边界范围,以便正确显示节点和边。​
节点和边的添加方法​

    def addNode(self, node):​self.nodes.append(node)​
​def addEdge(self, edge):​self.edges.append(edge)​
​

addNode 方法:接收一个 node 参数,将传入的节点对象添加到 self.nodes 列表中。当在节点编辑器中创建新的节点时,就会调用这个方法将新节点纳入到场景的管理中,方便后续对节点进行查找、操作和存储等处理。​
addEdge 方法:与 addNode 方法类似,接收一个 edge 参数,将传入的边对象添加到 self.edges 列表中。在节点之间建立连接关系时,新创建的边就会通过这个方法添加到场景中,实现对边的统一管理。​
节点和边的删除方法​

    def removeNode(self, node):​self.nodes.remove(node)​
​def removeEdge(self, edge):​self.edges.remove(edge)


removeNode 方法:接收一个 node 参数,从 self.nodes 列表中移除指定的节点对象。当需要在节点编辑器中删除某个节点时,调用这个方法可以将该节点从场景的管理中移除,同时后续可能还会触发一些与该节点相关的清理操作,比如删除与该节点连接的边等。​
removeEdge 方法:接收一个 edge 参数,从 self.edges 列表中移除指定的边对象。在断开节点之间的连接时,就会使用这个方法将对应的边从场景中删除,确保场景中的数据与实际的节点连接状态一致。
完整的node_scene文件:

# 从自定义模块node_graphics_scene中导入QDMGraphicsScene类。
# QDMGraphicsScene类通常用于处理图形场景的可视化相关操作,
# 例如绘制场景背景、管理场景中图形元素的显示等,为后续将逻辑数据可视化做准备
from node_graphics_scene import QDMGraphicsScene# 定义Scene类,该类用于管理节点编辑器中的节点和边的逻辑数据,
# 以及与图形场景进行交互,是整个节点编辑系统数据管理和协调的核心部分
class Scene:# 类的初始化方法,在创建Scene类的实例时自动调用,用于初始化对象的属性def __init__(self):# 创建一个空列表,用于存储节点对象。后续创建的节点都将添加到这个列表中,# 方便对节点进行统一管理,如遍历、查找、操作等self.nodes = []# 创建一个空列表,用于存储边对象。与节点列表类似,# 所有创建的边都会存放在这里,便于管理边的相关操作self.edges = []# 设置图形场景的宽度为64000,这个值定义了节点编辑区域在水平方向上的大小范围self.scene_width = 64000# 设置图形场景的高度为64000,确定了节点编辑区域在垂直方向上的大小范围self.scene_height = 64000# 调用initUI方法,用于初始化与图形场景相关的设置,# 建立逻辑场景与可视化图形场景之间的联系self.initUI()# 初始化用户界面的方法,主要负责创建图形场景实例并进行相关配置def initUI(self):# 创建QDMGraphicsScene类的实例grScene,并将当前Scene类的实例self作为参数传入。# 这样做可以使QDMGraphicsScene类获取到与当前逻辑场景相关的信息,# 实现逻辑场景与可视化图形场景之间的交互self.grScene = QDMGraphicsScene(self)# 调用grScene的setGrScene方法,将之前设置的场景宽度和高度传入。# 该方法会根据传入的尺寸对图形场景进行初始化配置,# 比如设置场景的边界范围,以确保节点和边能在正确的区域内显示self.grScene.setGrScene(self.scene_width, self.scene_height)# 向场景中添加节点的方法,接收一个node参数,代表要添加的节点对象def addNode(self, node):# 将传入的节点对象添加到self.nodes列表中,# 从而将新节点纳入到Scene类的管理体系中self.nodes.append(node)# 向场景中添加边的方法,接收一个edge参数,即要添加的边对象def addEdge(self, edge):# 将传入的边对象添加到self.edges列表中,# 实现对新创建边的统一管理self.edges.append(edge)# 从场景中移除节点的方法,接收一个node参数,指定要移除的节点对象def removeNode(self, node):# 从self.nodes列表中移除指定的节点对象,# 在实际应用中,删除节点可能还会引发与该节点相关的其他清理操作,# 以保证数据的一致性和准确性self.nodes.remove(node)# 从场景中移除边的方法,接收一个edge参数,用于指定要移除的边对象def removeEdge(self, edge):# 从self.edges列表中移除指定的边对象,# 确保场景中节点之间的连接关系与实际操作保持一致self.edges.remove(edge)

在node_graphics_scene.py文件中:
初始化原来函数:

class QDMGraphicsScene(QGraphicsScene):def __init__(self, parent=None):super().__init__(parent)

更改为:

class QDMGraphicsScene(QGraphicsScene):def __init__(self, scene, parent=None):super().__init__(parent)self.scene = scene

并且增加一个函数:

 def setGrScene(self, width, height):self.setSceneRect(-width // 2, -height // 2, width, height)

并且删除原来代码中:

self.scene_width, self.scene_height = 64000, 64000
self.setSceneRect(-self.scene_width//2, -self.scene_height//2, self.scene_width, self.scene_height)

在窗口的node_editor_wnd.py文件中:
首先调用

from node_scene import Scene

将原来的代码中的:

self.grScene = QDMGraphicsScene()

更改为:

    self.scene = Scene()self.grScene = self.scene.grScene

通过以上的步骤:实现了Scene函数的分离。

节点类

创建一个node_graphics_node.py

# 从PyQt5的QtWidgets模块导入所有的类和函数,该模块包含各种用于创建用户界面的组件,如按钮、布局、视图等
from PyQt5.QtWidgets import *
# 从PyQt5的QtCore模块导入所有的类和函数,此模块提供了核心功能,包括信号与槽机制、事件循环、定时器等
from PyQt5

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/86547.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/86547.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/86547.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过docker安装nginx服务

nginx配置文件 https://gitee.com/Cairo-SR8/nginx-configuration.git一、安装nginx 1.1 拉去ARM镜像 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/linux_arm64_nginx:latest1.2 拉去x86镜像 docker pull registry.cn-hangzhou.aliyuncs.com/qiluo-images/…

盲法在临床试验中的应用与挑战

一、盲法分级与科学价值 1.1 开放标签 1.1.1 受盲对象 无隐藏。 1.1.2 适用场景 外科手术、器械试验等无法伪装的操作。 1.1.3 偏倚控制目标 仅客观终点(生存率、实验室指标)。 1.2 单盲 1.2.1 受盲对象 患者。 1.2.2 适用场景 患者报告结局(PRO)为主的试验(如…

VNware启动虚拟机报错:虚拟化性能计数器需要版本为 3 或以上的架构性能监控。

Vmware版本:17.5 结论: 【编辑虚拟机设置-硬件-处理器-虚化计数器】没勾就勾上,勾了就不勾保存,然后重新打勾 备注:不知道是不是显示问题,之前勾着的时候报错。取消报错,再勾上报错能正常启动虚…

微机系统 - 第7章 -可编程接口芯片

可编程并行输入/输出接口芯片 8255A -1:结构 8255A为40引脚、双列直插封装。 内部结构由数据端口、组控制电路、数据总线缓冲器、读/写控制逻辑四部分组成。 数据总线缓冲器:三态8位双向缓冲器,D7-D0同系统数据总线相连。CPU通过执行输入/输出指令来实…

解析云计算虚拟化基石:KVM、QEMU与Libvirt的协同

在云计算和容器化大行其道的今天,传统虚拟化技术仍是企业IT架构的核心支柱。理解KVM、QEMU和Libvirt的关系,是掌握现代虚拟化技术的关键一步。 一、虚拟化技术演进:从软件模拟到硬件加速的进化之路 虚拟化技术通过在单台物理服务器上创建多个…

Mac mini 跑 DeepSeek R1 及 QwQ-32B模型实测报告

测试对象:2025 款 Mac mini(M4 / M4 Pro 芯片) 测试模型:DeepSeek-R1(14B/32B)、QwQ-32B(原版/量化版) 测试目标:硬件性能适配性、推理速度、内存占用及优化方案 一、Mac…

github常用插件

一,文档辅助阅读系列:自动化wiki处理 1,deepwiki https://deepwiki.com/ 将我们看不懂的官方code文档转换为wiki,更加便于理解。 其实能够翻阅的仓库很有限,比如说: 但是有很多仓库并没有index&#xff…

洛谷P11963 [GESP202503 六级] 环线-普及/提高-

题目描述 小 A 喜欢坐地铁。地铁环线有 n n n 个车站&#xff0c;依次以 1 , 2 , ⋯ , n 1,2,\cdots,n 1,2,⋯,n 标号。车站 i ( 1 ≤ i < n ) i\ (1\leq i<n) i (1≤i<n) 的下一个车站是车站 i 1 i1 i1。特殊地&#xff0c;车站 n n n 的下一个车站是车站 1 …

大网络办公区的二层生成树优化问题

办公区有华为和思科交换机&#xff0c;此次改造&#xff0c;在办公火墙上、下联&#xff0c;做3层IP地址互联&#xff0c;可以让大核心不参与办公区的STP网络收敛&#xff0c;就不会因为下面办公区的交换机stp收敛问题导致&#xff0c;核心连接的其他区域网络出现动荡&#xff…

重点解析(软件工程)

一. 概述 什么是软件、软件危机、软件工程 软件是可执行的指令&#xff08;程序&#xff09;、操作信息的数据以及描述程序操作和使用的文档的集合。 软件危机指软件开发速度跟不上需求增长&#xff0c;导致设计拙劣、维护困难&#xff0c;可能造成经济损失或灾难。 软件工程是…

Jina-Embeddings-V4:多模态向量模型的革命性突破与实战指南

当Jina-Embeddings-V4带着38亿参数和多模态能力登场时&#xff0c;它就像向量模型界的"变形金刚"——不仅能处理30语言的文本&#xff0c;还能把图像、表格甚至混合排版文档统统"吞"进同一个语义空间。传统方案如CLIP需要分别处理图像和文本再强行对齐&…

数据结构进阶 - 第四,五章 串、数组和广义表

数据结构进阶 - 串、数组和广义表 第四章 串&#xff08;String&#xff09; 4.1 串的基本概念 4.1.1 串的定义 串是受限的线性表&#xff1a;组成串的元素只能为字符串的特点&#xff1a; 操作位置受限元素类型受限&#xff08;只能是字符&#xff09;是线性表的推广和受限…

【力扣 困难 C】940. 不同的子序列 II

目录 题目 解法一&#xff1a;动态规划 题目 解法一&#xff1a;动态规划 int distinctSubseqII(char* s) {const int mod 1000000007;int dp[26] {0};int cnt 1;int len strlen(s);for (int i 0; i < len; i) {int new (cnt - dp[s[i] - a] mod) % mod;cnt (cnt…

【用户权限】chmod的简单使用(一)

一、用户和权限的基本概念 用户是 Linux 系统工作中重要的一环&#xff0c;用户管理包括用户与组管理。在 Linux 系统中&#xff0c;不论是由本机或是远程登录系统&#xff0c;每个系统都必须拥有一个账号&#xff0c;并且对于不同的系统资源拥有不同的使用权限。在Linux中&am…

Electron桌面程序初体验

Electron 是网页应用 (web apps) 的一个原生包装层&#xff0c;在 Node.js 环境中运行。所以需要开发者对 Node.js 和前端 Web 开发有一定地了解。下面我们就来初始化一个项目&#xff0c;试试看。 提示&#xff1a;本人使用的是npm命令&#xff0c;yarn命令也是可以的 1.初…

生信软件47 - 超低测序深度的全基因组测序cfDNA肿瘤分数估计工具ichorCNA

1. ichorCNA简介 ichorCNA是一种用于估计来自超低测序深度的全基因组测序&#xff08;ULP-WGS&#xff0c;0.1x覆盖率&#xff09;的cfDNA中肿瘤分数的工具。ichorCNA使用概率模型&#xff0c;应用隐马尔可夫模型&#xff08;HMM&#xff09;&#xff0c;以同时分割基因组&…

Python 解压缩(支持.zip/.rar/.7z格式)

&#x1f91f;致敬读者 &#x1f7e9;感谢阅读&#x1f7e6;笑口常开&#x1f7ea;生日快乐⬛早点睡觉 &#x1f4d8;博主相关 &#x1f7e7;博主信息&#x1f7e8;博客首页&#x1f7eb;专栏推荐&#x1f7e5;活动信息 文章目录 Python 解压缩&#xff08;支持.zip/.rar/.7…

龙虎榜——20250627

上证指数放量收阴线&#xff0c;回踩5天均线&#xff0c;但个股总体涨多跌少。 深证指数缩量收十字星&#xff0c;在前期压力位震荡。 2025年6月27日龙虎榜行业方向分析 1. 金融科技&#xff08;跨境支付数字安全&#xff09; 代表标的&#xff1a;吉大正元&#xff08;跨境认…

三步实现B站缓存视频转MP4格式

本期我们来实现如何将B站缓存的视频转成MP4格式&#xff0c;直接在本地播放。 首先我们在Bilibili客户端缓存一个视频&#xff0c;保存的文件如下&#xff1a; 这里有两个m4s文件&#xff0c;大的哪个是视频文件&#xff0c;小的是音频文件&#xff0c;这里我们用视频播放软件…

MySQL 与 Oracle 事务:深度解析与全面对比

在数据库管理领域&#xff0c;事务是确保数据一致性和完整性的核心机制&#xff0c;它允许用户将一系列操作视为一个不可分割的整体&#xff0c;要么全部成功执行&#xff0c;要么全部回滚。MySQL 和 Oracle 作为两款广泛使用的关系型数据库管理系统&#xff0c;它们在事务处理…