Python+PyQt架構:Graphics View快速繪圖入門及坐標系統示例

2021-01-10 編碼那些事

繪圖架構Graphics View介紹

在Qt界面庫中,對於圖形的繪製,在前面一篇文章中(可參考:),介紹了一種使用QPainter實現普通二維圖形的繪製方法,該方法在paintEvent事件裡編寫繪圖程序,其本質繪製的圖形是位圖,這種方法更適合於繪製複雜度不高的固定圖形,並且不能實現圖項的選擇、編輯、拖放、修改等交互功能。

對於需要繪製大量的、需要交互的圖形,可使用Graphics View繪圖架構,它是一種基於圖形項(Graphics Item)的模型/視圖模式,這種方式可以在一個場景中可繪製大量圖元項,且每個圖元項都是可選擇、可交互的。

在Graphics View繪圖架構中,主要涉及到下面三個類的使用:

1. 場景類(QGraphicsScene):該類提供繪圖場景(Scene),場景是不可見的,是一個抽象的管理圖形項的容器,可向場景中添加圖形項,獲取場景中的某個圖形項等;

2. 視圖類(QGraphicsView):該類提供繪圖的視圖(View)組件,用於顯示場景中的內容。可以為一個場景設置幾個視圖,用於對同一個數據集提供不同的觀察方式;

3. 圖形項類(QGraphicsItem):該類提供了一些基本的圖形元件,也可在此基礎上自定義圖形項,它支持各種事件的響應,如滑鼠事件、鍵盤事件、拖放事件等,以實現圖形的交互功能。

在Graphics View繪圖架構中涉及到了3個坐標系,即場景坐標、視圖坐標及圖形項坐標。其中,場景坐標類似於QPainter的邏輯坐標,一般以場景的中心為原點;視圖坐標是窗口界面的物理坐標,其左上角為原點坐標;圖形項坐標是局部邏輯坐標,通常以圖件的中心為原點。

下面給出一個在Python語言下結合PyQt界面庫,使用Graphics View架構進行繪圖的例子,例子中也涉及到了坐標系統的理解。

示例說明

該例運行界面如下圖所示:

在主窗口的視圖上顯示了四個圖元(圖元項),包括三個可選擇、可移動且不同填充顏色的圓形,一個標識場景大小的矩形框。當滑鼠移動時,在狀態欄中實時顯示當前滑鼠位置的三種坐標,即視圖(View)坐標、場景(Scene)坐標及圖形項(Item)坐標。

本例主界面的Python程序使用純代碼方式實現,下面給出該例的實現過程。

自定義的視圖類設計

由於在視圖中需要監視獲取當前的滑鼠移動位置,故設計了一個單獨的基於QGraphicsView基類的視圖類,其實現代碼如下圖所示:

該類中定義了一個自定義信號sigMouseMovePoint,當滑鼠移動時,在mouseMoveEvent事件中,將當前的滑鼠位置發送出去。

主窗口類設計

主窗口基於QMainWindow類,在其中添加一個視圖控制項用於顯示圖元及一個狀態欄控制項用於顯示坐標。其實現代碼如下圖所示:

其主要代碼解釋如下:

(1)第25-31行,窗口類的初始化函數,並且設置了視圖類sigMouseMovePoint信號響應的槽函數。

(2)第33-48行,在主窗口上創建視圖控制項並將其設置為中心部件,設置狀態欄信息。

(3)第50-67行,在視圖中完成圖形的繪製。先創建視圖的場景,然後創建矩形框,其大小為場景大小,將矩形框添加到場景中,然後依次創建三個圓形,其位置分別為矩形框的左邊界、中心及右邊界,設置為可移動、可選擇及可設置焦點屬性,最後將其添加到場景中。

(4)第69-76行,當視圖中滑鼠移動時,獲取三種坐標。其中參數pt為視圖坐標。使用視圖類的mapToScene函數可將其轉換為場景坐標。根據場景坐標可獲取當前滑鼠位置的圖形項,進而由圖形項類的mapFromScene函數可得到當前圖形項的坐標。得到這些坐標後可在狀態欄中進行顯示。

完整測試代碼

程序完整測試代碼如下圖所示:

運行後就會出現本文開頭所示的軟體界面,且在主界面上移動滑鼠時,可在狀態欄中實時得到三種坐標。

總結

本文例子演示了在Python+PyQt架構下,使用Graphics View繪圖架構進行簡單繪圖的過程,並在例子中給出了三種坐標的轉換方法。其繪圖過程基本上可總結為下面幾個步驟,即創建視圖、創建場景、關聯場景到視圖、在場景中創建各種圖形項、完成圖形的顯示等。

本文由編碼那些事原創,請關注+轉發+收藏+點讚,帶你一起長知識!

相關焦點

  • Python數據可視化之高速繪圖神器PyQtGraph庫,強烈建議收藏
    但是這些繪圖庫也存在著不足,即在圖形繪製速度上有所欠缺,特別是對於科研算法方面的數據可視化,很多情況需要實時繪圖,要求能夠提供儘可能快的繪製刷新速度,那這些庫顯的有些力不從心了。而我們下面要介紹的繪圖庫-PyQtGraph庫,則在繪圖速度方面表現尤其突出,在不失繪圖美觀、功能強大的前提下,在繪圖速度方面作了極大的優化,特別適合於實時數據採集的動態圖形繪製場合。
  • Python語言中使用pyqtgraph庫實現數據可視化
    背景在Python程式語言中,matplotlib是一種常用的用於數據可視化的繪圖庫,它提供了一套和matlab相似的命令API,開發者可以僅需幾行代碼,便可生成如直方圖,功率譜,條形圖,錯誤圖,散點圖等圖形,適用於交互式繪圖,而且也可以方便地將它作為繪圖控制項嵌入到GUI應用程式中
  • Python 繪圖庫 Matplotlib 入門教程
    qiangbo.space/2018-04-06/matplotlib_l1/Matplotlib是一個Python語言的2D繪圖庫,它支持各種平臺,並且功能強大,能夠輕易繪製出各種專業的圖像。入門代碼示例下面我們先看一個最簡單的代碼示例,讓我們感受一下Matplotlib是什麼樣的:# test.py import matplotlib.pyplot as pltimport numpy as np
  • 30分鐘入門 Matplotlib 繪圖
    Matplolib最初主要模仿Matlab的畫圖命令,但是它是獨立於Matlab的,可以自由、免費使用的繪圖包。Matplotlib依賴於之前介紹的Numpy庫來提供出色的繪圖能力。以Windows為例,進入CMD窗口中,使用pip命令安裝Matplotlib,系統會自動進行安裝。pip install matplotlib如果安裝失敗,可以使用國內的鏡像來安裝Matplotlib庫,如下所示。
  • python的繪圖利器--海龜繪圖turtle
    這個語句是個固定格式,有這句話畫完圖,繪圖窗口還保留,如果沒有這句話,繪圖窗口就直接關閉了,所以初期都加上就好了。下面,我們就進入正題:公共設置公共設置的第一條import turtleimport是導入,turtle是海龜繪圖庫,所以這句話就是導入海龜會圖庫的意思,記住就可以了。
  • 如何快速學會Python爬蟲(入門篇)
    一、爬蟲入門Python爬蟲入門一之綜述2.Python爬蟲入門二之爬蟲基礎了解3. Python爬蟲入門三之Urllib庫的基本使用4. Python爬蟲入門四之Urllib庫的高級用法5. Python爬蟲入門五之URLError異常處理6.
  • 使用Python玩轉高等數學(5):三角函數
    安裝matplotlib最簡單的方法就是在作業系統的命令行窗口分別輸入並執行下面的命令:python -m pip install -U pip setuptoolspython -m pip install -U matplotlib使用matplotlib繪圖,會用到Numpy庫,Numpy庫主要用於科學計算。
  • python學習筆記:快速繪圖和3D柱狀圖
    快速繪圖#首先載入 matplotlib 的繪圖模塊 pyplot ,並且命名為 plt。figure12.簡單折線圖#導入繪圖所需要的包,首先導入了模塊 pyplot ,並給它指定了別名 plt ,以免反覆輸入 pyplotimport matplotlib.pyplot as pltinput_values
  • Python繪圖筆記:繪製四色散點圖和誤差條形圖
    figure1#導入繪製散點圖所需要的包import matplotlib.pyplot as pltfrom numpy.random import rand#生成繪圖所需的圖紙fig, ax = plt.subplots
  • 三分鐘從入門到精通——Python模塊
    #Python入門教程#什麼是python中的模塊:假設您正在使用python解釋器。示例:讓我們創建一個模塊。在文件中鍵入以下函數,並將其另存為utils.py。要使用utils定義的函數或類,我們必須使用上面示例()中所示的表示法。如果您嘗試直接使用乘法,則python會拋出如下所示的異常:dot (.)
  • 一個Python GUI神器,雙手徹底解放!
    PySimpleGUI含有成百上千的書面文檔頁面和示例程序,這將幫助我們快速有效地工作。使用PySimpleGUI可能無需花幾天或幾周的時間來學習一個GUI包,而是可以在一個下午內完成項目。下面的YOLO演示是一個很好的示例,說明GUI如何在與AI算法交互中產生巨大的變化。注意窗口底部的兩個滑塊,這兩個滑塊可更改YOLO算法使用的兩個參數。繪圖使用PySimpleGUI在GUI中顯示數據交互很簡單,有幾種選擇。
  • 基於Python圖表繪圖系統:matplotlib散點圖和氣泡圖,你了解嗎?
    慣例先來簡單介紹下什麼是散點圖:用兩組數據構成多個坐標點,考察坐標點的分布,判斷兩變量之間是否存在某種關聯或總結坐標點的分布模式。散點圖將序列顯示為一組點。值由點在圖表中的位置表示。類別由圖表中的不同標記表示。
  • 學習筆記,從NumPy到Scrapy,學習Python不能錯過這些庫
    在網絡上看到幾位前輩寫了關於python深度學習庫的文章,對於小小白來說,因為我剛開始學python,我得承認自己看完後依然覺得雲裡霧裡的,不知道這些庫到底對我有什麼用處。所以我到網絡上搜集補充關於這些庫的說明內容,感覺在這個整理資料的過程中,對於這些python程序庫了解了更多,以下是我整理的學習筆記。
  • Python使用ctypes模塊調用DLL函數之C語言數組與numpy數組傳遞
    詳細細節請參考:python使用ctypes模塊調用DLL函數之傳遞數值、指針與字符串參數、Python使用ctypes模塊調用DLL函數之傳遞結構體參數這次講一下在Python中使用ctypes模塊調用DLL中的庫函數傳遞數組參數的情況。
  • 未明學院:Python可視化庫Matplotlib繪圖入門詳解
    Matplotlib是Python的繪圖庫,其中的pyplot包封裝了很多畫圖的函數。Matplotlib.pyplot 包含一系列類似 MATLAB 中繪圖函數的相關函數。每個 Matplotlib.pyplot 中的函數會對當前的圖像進行一些修改,例如:產生新的圖像,在圖像中產生新的繪圖區域,在繪圖區域中畫線,給繪圖加上標記,等等…… Matplotlib.pyplot 會自動記住當前的圖像和繪圖區域,因此這些函數會直接作用在當前的圖像上。
  • 《小灰教你零基礎學python》-Python入門語言
    程式語言有很多,咱們就學簡單強大的python即可。Python是一種清晰而強大的面向對象程式語言,不過還沒入門的小白不要想多了哈,不是你的對象(女朋友?)而是一種語言架構,點擊查看百度百科解釋: 面向對象程序設計。所以可以與Perl、Ruby、和Java等語言相媲美。
  • Python趣味打怪:147段簡單代碼完成從入門到大師
    入門簡單如十進位轉二進位,盡顯Python簡潔之美:In [1]: bin(10)Out[1]: '0b1010'冬天到了,就算沒有點亮手繪技能,也能用簡單幾行代碼繪出漫天雪花:例子是有趣的例子,教程也是正經教程,學習路徑清晰、系統,先一起來看看完整目錄:
  • Python基礎教程(一) - 快速入門
    從今天開始學習python,會將學習到的相關知識整理到這裡。今後的所有內容都基於Ubuntu系統中進行的,和其他語言一樣,讓我們先來"Hello World!"吧。Hello world!#!/usr/bin/python為Linux系統下Python解釋器的路徑,通常python解釋器的路徑安裝在/usr/local/bin或/usr/bin目錄下。
  • 放棄PK,擁抱合作——R和 Python 能做出什麼新花樣?
    Pandey翻譯 | 醬番梨、董星、CONFIDANT、穿著涼鞋走天下 校對 | 詹森•李加薪        審核 | Pita       整理 | 立魚王原文連結:https://towardsdatascience.com/from-r-vs-python-to-r-and-python-aa25db33ce17