PyQtNode Editor 第二篇自定義可視化視圖

在這里插入圖片描述
在第一篇博客中,我們已經完成了 PyQtNode Editor 的基礎環境搭建,并深入解析了自定義圖形場景QDMGraphicsScene的實現原理。那個帶有網格背景的場景就像一張空白的圖紙,現在我們要在這張圖紙上開始繪制真正的節點系統。

今天我們將聚焦于節點編輯器的核心數據結構設計,實現 “節點類” 與 “圖形節點類” 的分離,并完成第一個可交互節點的創建。這一步是整個編輯器的骨架,就像建造房屋時搭建承重結構一樣關鍵。

一、自定義可視化視圖函數

創建一個node_graphic_view.py文件
在 PyQtNode Editor 的開發過程中,圖形視圖的設置對于用戶最終看到的界面效果和操作體驗至關重要。接下來,我們深入解析QDMGraphicsView類的代碼,看看它是如何定制圖形場景的顯示與交互的。
導入必要的模塊

from PyQt5.QtWidgets import QGraphicsView?
from PyQt5.QtCore import *?
from PyQt5.QtGui import *

from PyQt5.QtWidgets import QGraphicsView:從PyQt5.QtWidgets模塊中導入QGraphicsView類。QGraphicsView是 PyQt5 中用于顯示QGraphicsScene(圖形場景)的視圖類,它就像是一個 “畫框”,可以將在場景中繪制的圖形、節點等內容展示出來,并且提供了縮放、滾動等與圖形交互的功能基礎。?
from PyQt5.QtCore import *:導入PyQt5.QtCore模塊中的所有內容。這個模塊包含了 PyQt5 的核心功能,例如信號與槽機制、定時器、元對象系統等,這些功能為圖形視圖的事件處理、狀態管理等提供底層支持 。?
from PyQt5.QtGui import *:導入PyQt5.QtGui模塊中的所有內容。該模塊主要用于處理圖形相關的操作,比如繪制圖形、設置畫筆和畫刷樣式、處理字體等,是實現圖形視圖美觀顯示效果的關鍵。

定義 QDMGraphicsView 類

class QDMGraphicsView(QGraphicsView):

這里定義了一個名為QDMGraphicsView的類,它繼承自QGraphicsView。繼承的作用在于,QDMGraphicsView類可以復用QGraphicsView類已有的功能,同時在此基礎上添加或修改特定的功能,以滿足 PyQtNode Editor 項目中對于圖形視圖的個性化需求。

    def __init__(self, grScene, parent=None):?super().__init__(parent)?self.grScene = grScene?
?self.initUI()?
?self.setScene(self.grScene)

super().init(parent):調用父類QGraphicsView的初始化方法,確保父類的屬性和行為得到正確的初始化,就像建造房子時先搭建好基本的框架結構。?
self.grScene = grScene:將傳入的圖形場景對象grScene賦值給當前類的實例屬性self.grScene。這樣,QDMGraphicsView類的實例就與特定的圖形場景建立了關聯,后續視圖展示的內容就是這個場景中的元素。?
self.initUI():調用自定義的initUI方法,用于對圖形視圖進行一些個性化的設置,比如渲染效果、滾動條策略等。?
self.setScene(self.grScene):將之前保存的圖形場景對象self.grScene設置為當前圖形視圖要顯示的場景。這一步就像是把一幅畫放入畫框中,圖形視圖會將場景中的圖形、節點等內容展示出來供用戶查看和交互。

def initUI(self):self.setRenderHints(QPainter.Antialiasing | QPainter.HighQualityAntialiasing | QPainter.TextAntialiasing | QPainter.SmoothPixmapTransform)self.setViewportUpdateMode(QGraphicsView.FullViewportUpdate)self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

self.setRenderHints(QPainter.Antialiasing | QPainter.HighQualityAntialiasing | QPainter.TextAntialiasing | QPainter.SmoothPixmapTransform):通過setRenderHints方法設置圖形渲染的提示選項。這里使用了按位或操作組合了多個渲染提示:?
QPainter.Antialiasing:啟用抗鋸齒功能,使繪制的圖形邊緣更加平滑,避免出現鋸齒狀。?
QPainter.HighQualityAntialiasing:進一步提高抗鋸齒的質量,讓圖形看起來更加精美。?
QPainter.TextAntialiasing:對文本進行抗鋸齒處理,保證顯示的文字清晰、美觀。?
QPainter.SmoothPixmapTransform:使圖像在縮放或變換時更加平滑,避免出現模糊或失真的情況。?
self.setViewportUpdateMode(QGraphicsView.FullViewportUpdate):使用setViewportUpdateMode方法設置視圖端口的更新模式為QGraphicsView.FullViewportUpdate。這意味著每當場景發生變化時,整個視圖端口都會被更新。雖然這種方式在性能上可能不如其他更精細的更新模式,但可以確保視圖顯示的內容始終是最新和完整的。?
self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)和self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff):分別設置水平和垂直滾動條的策略為Qt.ScrollBarAlwaysOff,即始終隱藏滾動條。這表明在當前的設計中,不希望用戶通過滾動條來滾動視圖,可能是因為場景的尺寸設置以及整體交互設計不需要滾動條,或者后續會通過其他方式(如鼠標滾輪縮放等)來實現對場景的瀏覽。

完整代碼node_graphic_view.py

# 導入PyQt5的QGraphicsView類,用于顯示和操作QGraphicsScene中的內容
from PyQt5.QtWidgets import QGraphicsView
# 導入PyQt5的核心模塊,包含信號與槽、事件系統等基礎功能
from PyQt5.QtCore import *
# 導入PyQt5的GUI模塊,包含繪圖、字體、顏色等圖形相關功能
from PyQt5.QtGui import *# 自定義圖形視圖類,繼承自QGraphicsView,用于顯示和操作節點編輯器的圖形場景
class QDMGraphicsView(QGraphicsView):# 類的構造函數,接收圖形場景對象和可選的父對象def __init__(self, grScene, parent=None):# 調用父類的構造函數完成初始化super().__init__(parent)# 保存傳入的圖形場景對象的引用self.grScene = grScene# 初始化用戶界面設置self.initUI()# 將圖形場景設置到視圖中,使視圖顯示該場景的內容self.setScene(self.grScene)# 初始化用戶界面的方法,設置視圖的各種屬性和行為def initUI(self):# 設置渲染提示,啟用多項抗鋸齒和高質量渲染選項:# - Antialiasing:平滑圖形邊緣,減少鋸齒# - HighQualityAntialiasing:使用更高質量的抗鋸齒算法# - TextAntialiasing:平滑文本邊緣,提高可讀性# - SmoothPixmapTransform:平滑處理縮放和變換后的像素圖self.setRenderHints(QPainter.Antialiasing | QPainter.HighQualityAntialiasing | QPainter.TextAntialiasing | QPainter.SmoothPixmapTransform)# 設置視圖更新模式為完全更新,每次場景變化時重繪整個視圖# 這種模式確保顯示效果一致,但可能影響性能self.setViewportUpdateMode(QGraphicsView.FullViewportUpdate)# 設置水平滾動條策略為始終關閉,不顯示水平滾動條self.setHorizontalScrollBarPolicy(Qt.ScrollBarAlwaysOff)# 設置垂直滾動條策略為始終關閉,不顯示垂直滾動條self.setVerticalScrollBarPolicy(Qt.ScrollBarAlwaysOff)

二、調用自定義視圖函數

回到node_graphic_wnd.py文件
導入我們自定義的畫布樣式:

from node_graphics_view import QDMGraphicsView

然后對原來系統的標準視圖更改成我們自定義的視圖:
這個是原來的

self.view = QGraphicsView(self)
self.view.setScene(self.grScene)

更改后的:

    self.view = QDMGraphicsView(self.grScene, self)

然后添加一個addDebugContent()方法向場景中添加了多種圖形元素用于測試:

def addDebugContent(self):# 創建綠色畫刷和黑色輪廓畫筆greenBrush = QBrush(Qt.green)outlinePen = QPen(Qt.black)outlinePen.setWidth(2)# 添加可移動的矩形rect = self.grScene.addRect(-100, -100, 80, 100, outlinePen, greenBrush)rect.setFlag(QGraphicsItem.ItemIsMovable)# 添加可選擇和移動的文本text = self.grScene.addText("This is my Awesome text!", QFont("Ubuntu"))text.setFlag(QGraphicsItem.ItemIsSelectable)text.setFlag(QGraphicsItem.ItemIsMovable)text.setDefaultTextColor(QColor.fromRgbF(1.0, 1.0, 1.0))# 添加可移動的按鈕控件widget1 = QPushButton("Hello World")proxy1 = self.grScene.addWidget(widget1)proxy1.setFlag(QGraphicsItem.ItemIsMovable)proxy1.setPos(0, 30)# 添加可選擇的文本編輯控件widget2 = QTextEdit()proxy2 = self.grScene.addWidget(widget2)proxy2.setFlag(QGraphicsItem.ItemIsSelectable)proxy2.setPos(0, 60)# 添加可選擇和移動的線條line = self.grScene.addLine(-200, -200, 400, -100, outlinePen)line.setFlag(QGraphicsItem.ItemIsMovable)line.setFlag(QGraphicsItem.ItemIsSelectable)

最終完整的node_graphic_wnd.py文件

# 從PyQt5的QtWidgets模塊導入所有的類和函數,該模塊包含各種用于創建用戶界面的組件,如窗口、按鈕、布局等
from PyQt5.QtWidgets import *
# 從PyQt5的QtGui模塊導入所有的類和函數,此模塊用于處理圖形相關操作,如畫筆、畫刷、字體、繪圖等功能
from PyQt5.QtGui import *
# 從PyQt5的QtCore模塊導入所有的類和函數,該模塊提供了PyQt5的核心功能,包括信號與槽機制、事件循環、定時器等
from PyQt5.QtCore import *# 從自定義模塊node_graphics_scene中導入QDMGraphicsScene類,該類用于創建自定義的圖形場景
from node_graphics_scene import QDMGraphicsScene

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/86624.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/86624.shtml
英文地址,請注明出處:http://en.pswp.cn/web/86624.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【擴歐應用】同余方程

與擴歐的聯系 在同余方程的求解過程中,我們通常需要將方程轉化為線性不定方程(Diophantine 方程)的形式,然后使用擴展歐幾里得算法(Extended Euclidean Algorithm, EEA)求解。 同余方程是怎么轉化為線性不…

結構化數據:NumPy 的結構化數組

文章目錄 結構化數據:NumPy 的結構化數組探索結構化數組的創建更高級的復合類型記錄數組:結構化數組的變體走向 Pandas 結構化數據:NumPy 的結構化數組 雖然我們的數據通常可以用同質數組很好地表示,但有時情況并非如此。本文將演…

phpcms 更換新域名更新欄目url和內容頁url無法更新解決方法

更換域名后更新欄目url和內容頁url還是無法更新為新的域名,手動把cache文件夾下能清除的緩存文件清除了還是不行,把數據庫的緩存表內容清空了還是不行,問題在于欄目緩存并沒有清除。 解決辦法: (1)、找到文件:/caches/configs/sys…

瑪哈特七輥矯平機:板材平整的精密衛士

在金屬板材加工領域,表面平整度是衡量產品質量的核心指標之一。無論是汽車覆蓋件、精密儀器外殼,還是建筑裝飾板材,任何彎曲、波浪或翹曲都將嚴重影響后續加工精度、產品強度及美觀度。七輥矯平機,憑借其獨特的輥系結構設計&#…

融合聚類與分類的退役鋰電智能分選技術:助力新能源汽車產業可持續發展

融合聚類與分類的退役鋰電智能分選技術:助力新能源汽車產業可持續發展 關鍵詞:退役鋰離子電池分選 | 聚類分類融合 | 電化學阻抗譜(EIS) | 動態時間規整(DTW) | 多模態分類模型 新能源汽車 | 電池梯次利用 | 增量學習 | 數字孿生 | 聯邦學習 | 雙流特征…

jenkins中執行python腳本導入路徑錯誤

🧾 問題一:ModuleNotFoundError: No module named jenkins 🔍 現象: 在本地運行正常,但在 Jenkins 中運行腳本時報錯,提示找不到 jenkins 模塊。 ? 原因分析: Python 默認只從當前目錄或已…

華為云Flexus+DeepSeek征文 | 華為云ModelArts Studio實戰指南:創建高效的AingDesk知識庫問答助手

華為云FlexusDeepSeek征文 | 華為云ModelArts Studio實戰指南:創建高效的AingDesk知識庫問答助手 前言一、ModelArts Studio介紹1. 華為云ModelArts Studio簡介2. 華為云ModelArts Studio主要特點3. 華為云ModelArts Studio主要使用場景 二、AingDesk介紹1. AingDes…

NLP基礎1_word-embedding

基于github項目:https://github.com/shibing624/nlp-tutorial/tree/main 自然語言處理任務 1) 簡單任務 拼寫檢查 Spell Checking 關鍵詞檢索 Keyword Search 同義詞查找 Finding Synonyms 2) 中級任務 解析來自網站、文檔等的信息 3) 復雜任務 機器翻譯 Ma…

ClickHouse系列--BalancedClickhouseDataSource實現

clickhouse-jdbc中負載均衡數據源的實現。 基本邏輯如下: 1.通過配置的url串,來切分構造url列表; 2.通過一個定時線程任務,來不斷的去ping url列表,來更新可用的url列表; 3.在可用列表中隨機返回一個可用ur…

Linux目錄說明

Linux Filesystem Hierarchy Standard(FHS) 1. /bin 全稱:Binary(二進制文件)功能:存放系統最基礎的可執行命令,所有用戶(包括普通用戶)都能使用,用于系統啟…

鴻蒙 Grid 與 GridItem 深度解析:二維網格布局解決方案

一、引言:網格布局 —— 多維度數據展示的黃金方案 在鴻蒙應用開發體系中,網格布局作為處理多元素有序排列的核心方案,廣泛應用于電商商品陳列、圖片畫廊、功能矩陣等場景。鴻蒙提供的 Grid 與 GridItem 組件通過聲明式語法構建靈活的二維布…

??Vue 開發環境配置:使用 devServer.proxy 解決跨域問題?-vue中文件vue.config,js中配置devserver做反向代理到后端

??Vue 開發環境配置:使用 devServer.proxy 解決跨域問題?? ??引言?? 在現代 Web 開發中,前端和后端通常獨立開發,前端運行在 http://localhost:8080,而后端可能運行在 http://localhost:8000 或其他端口。由于瀏覽器的 …

JVM 中的 GC 算法演進之路!(Serial、CMS、G1 到 ZGC)

引言 想象一下,Java 程序運行就像在一個巨大的圖書館里借書還書。這個圖書館(JVM 的內存堆區)為了高效運轉,需要一個聰明的“圖書管理員”來清理失效的書籍(垃圾對象)。這,就是垃圾回收器&#…

(9)python+playwright自動化測試-頁面(page)

1.簡介 通過前邊的講解和學習,細心認真地你可能發現在Playwright中,沒有Element這個概念,只有Page的概念,Page不僅僅指的是某個頁面,例如頁面間的跳轉等,還包含了所有元素、事件的概念,所以我們…

《自動控制原理 》- 第 1 章 自動控制的基本原理與方式

1-1 自動控制的基本原理與方式 自動控制是指在沒有人直接參與的情況下,利用外加的設備或裝置,使機器、設備或生產過程的某個工作狀態或參數按照預定的規律運行。自動控制的核心原理是反饋控制,即通過將系統的輸出量回送到輸入端,與…

DL00715-基于YOLOv11的水面漂浮物目標檢測含數據集

【論文必備】基于YOLOv11的水面漂浮物目標檢測——讓你的研究走在科技前沿! 在環境監測、海洋保護和水質管理領域,水面漂浮物的檢測一直是一個亟待解決的難題。傳統的人工巡檢方式不僅耗時費力,還無法覆蓋廣泛的水域范圍。如今,基…

權電阻網絡DAC實現電壓輸出型數模轉換Multisim電路仿真——硬件工程師筆記

目錄 1 基礎知識 1.1 運算放大器在DAC中的作用 1.2 常見的基于運算放大器的DAC電路 1.2.1 倒T形電阻網絡DAC 1.2.2 權電阻網絡DAC 1.2.3 開關電容DAC 1.3 運算放大器的選擇 1.4 設計注意事項 2 仿真實驗 2.1 權電阻網絡DAC實現數字0對應電壓輸出 2.2 權電阻網絡DAC實…

Redis主從集群

? 一、什么是 Redis 主從集群? Redis 主從(Master-Slave)集群是一種最基礎的集群方式: 一臺 Redis 作為主節點(Master),負責寫操作; 一到多臺 Redis 作為從節點(Slave&…

【水印論文閱讀1】將水印規則的定義域從離散的符號空間轉移到連續的語義空間

【水印論文閱讀1】將水印規則的定義域從離散的符號空間轉移到連續的語義空間 寫在最前面**為什么“token序列空間”有根本缺陷?****為什么“語義向量空間”能破局?****1. 連續性(抗攻擊的核心)****2. 高維復雜性(防破解…

Glide緩存機制

一、緩存層級與設計目標 雙級緩存: 內存緩存:弱引用 LruCache 磁盤緩存:DiskLruCache 設計目標: 減少網絡流量消耗 避免Bitmap頻繁創建/銷毀引發的GC 提升圖片加載速度 二、內存緩存機制 1. 雙緩存結構 緩存類型存儲對象…