在 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