引言
圖形與圖像繪制支持是一個(gè)GUI框架庫(kù)的核心模塊之一,從Java的Graphics2D到Android的Canvas類支持到PyQT5中的QPainter類支持與圖元支持,都很好的滿足了GUI庫(kù)的圖形繪制與渲染需求。
QPainter類介紹
QPainter類是PyQT5中圖形繪制類,支持圓、橢圓、矩形、圓角矩形、線段、文本、圖像、多邊形、弧形等常見(jiàn)幾何形狀的繪制與填充,支持顏色、旋轉(zhuǎn)、狀態(tài)復(fù)位、平移、錯(cuò)切等設(shè)置操作。所有的QWidget類都繼承了paintEvent方法,繪制代碼都應(yīng)該在paintEvent方法中完成執(zhí)行。一個(gè)典型的paintEvent方法繪制代碼如下:
def paintEvent(self, paintEvent):
painter = QPainter(self)
painter.setPen(Qt.blue)
painter.setFont(QFont("Arial", 30))
painter.drawText(rect(), Qt.AlignCenter, "OpenCV學(xué)堂")
上述代碼首先獲取畫(huà)筆,然后設(shè)置顏色與字體,最后繪制文本。通過(guò)用戶創(chuàng)建Painter實(shí)例的方式繪制,繪制結(jié)束之后需要顯式銷毀,通過(guò)系統(tǒng)的painter繪制則無(wú)需這樣,對(duì)比如下: 用戶創(chuàng)建繪制
def paintEvent(self, paintEvent):
p = QPainter()
p.begin(self)
p.drawLine(...) # drawing code
p.end()
調(diào)用系統(tǒng)繪制
def paintEvent(self, paintEvent):
p = QPainter(self)
p.drawLine(...) # drawing code
所有繪制的函數(shù)支持都是draw開(kāi)頭,所有填充的函數(shù)都是fill開(kāi)頭,什么繪制與填充,請(qǐng)看下圖:
綜合代碼演示
代碼實(shí)現(xiàn)了繪制與填充不同的幾何形狀,支持不同顏色設(shè)置,線寬設(shè)置,風(fēng)格設(shè)置等。運(yùn)行結(jié)果如下圖:

添加上顯示圖像功能之后如下:

相關(guān)自定義繪制類代碼如下:
1fromPyQt5importQtWidgets
2fromPyQt5importQtGui
3fromPyQt5importQtCore
4importsys
5
6
7classMyCustomCanvas(QtWidgets.QWidget):
8def__init__(self):
9super().__init__()
10print("createmycustomcanvas")
11
12defpaintEvent(self,event):
13painter=QtGui.QPainter(self)
14#設(shè)置為反鋸齒
15painter.setRenderHint(QtGui.QPainter.Antialiasing)
16
17#填充黑色背景
18painter.fillRect(self.rect(),QtCore.Qt.black)
19
20#繪制圖像
21pic=QtGui.QPixmap("test3.png")
22painter.drawPixmap(self.rect(),pic)
23
24#設(shè)置字體與顏色,繪制文本
25pen=QtGui.QPen(QtCore.Qt.green,5,QtCore.Qt.DashLine)
26painter.setPen(pen)
27font=QtGui.QFont()
28font.setBold(True)
29font.setPointSizeF(24)
30painter.setFont(font)
31painter.drawText(QtCore.QPoint(20,50),"OpenCV學(xué)堂")
32
33#5表示線寬
34pen=QtGui.QPen(QtCore.Qt.red,5,QtCore.Qt.DashLine)
35painter.setPen(pen)
36painter.drawLine(50,100,50,400)
37
38#繪制矩形
39pen=QtGui.QPen(QtCore.Qt.yellow,5,QtCore.Qt.DotLine)
40painter.setPen(pen)
41painter.drawRect(QtCore.QRect(100,100,200,200))
42painter.fillRect(100,100,200,200,QtCore.Qt.green)
43
44#繪制圓
45pen=QtGui.QPen(QtCore.Qt.red,5,QtCore.Qt.DotLine)
46painter.setPen(pen)
47
48#設(shè)置為填充模式
49painter.setBrush(QtGui.QBrush(QtCore.Qt.yellow,QtCore.Qt.SolidPattern))
50
51#直接繪制
52painter.drawEllipse(QtCore.QRect(300,300,150,150))
53
54#貝塞爾曲線
55painter.setBrush(QtGui.QBrush(QtCore.Qt.red,QtCore.Qt.SolidPattern))
56self.drawBezierCurve(painter)
57
58defdrawBezierCurve(self,qp):
59path=QtGui.QPainterPath()
60path.moveTo(450,100)
61path.cubicTo(450,100,550,200,450,350)
62qp.drawPath(path)
審核編輯:劉清
-
JAVA
+關(guān)注
關(guān)注
20文章
2992瀏覽量
115256 -
GUI
+關(guān)注
關(guān)注
3文章
690瀏覽量
42579 -
pyqt5
+關(guān)注
關(guān)注
0文章
25瀏覽量
3585
原文標(biāo)題:PyQT5開(kāi)發(fā)之自定義QWegdit實(shí)現(xiàn)圖形繪制
文章出處:【微信號(hào):CVSCHOOL,微信公眾號(hào):OpenCV學(xué)堂】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
可視可交互!H618上用OpenCV讀取圖像顯示到PyQt5窗口上
使用PyQt5自動(dòng)初始化OpenVINO?環(huán)境出現(xiàn)報(bào)錯(cuò)怎么解決?
PyQt
【Firefly RK3399試用體驗(yàn)】第二篇:PyQt5大戰(zhàn)點(diǎn)燈
【Firefly RK3399試用體驗(yàn)】PyQt5信號(hào)檢測(cè)系統(tǒng)(結(jié)項(xiàng))
主要介紹繪圖類QPainter
利用PyQt5編輯軟件界面的簡(jiǎn)單步驟
如何使用Python配合PyQT5模塊來(lái)開(kāi)發(fā)圖形化應(yīng)用程序
魯班貓0 ubuntu20 解決python3.10安裝pyqt5
Python PyQt5工具在Windows平臺(tái)上的安裝方法
PyQt5的中文教程電子書(shū)免費(fèi)下載
OpenCV+PyQT5開(kāi)發(fā)桌面應(yīng)用幾個(gè)重要的坑與解決
請(qǐng)問(wèn)PyQT5是如何構(gòu)建YOLOv8界面應(yīng)用程序的
使用pycharm開(kāi)發(fā)上位機(jī)配置pyqt5的環(huán)境
基于PyQT5與ONNXRUNTIME實(shí)現(xiàn)風(fēng)格遷移應(yīng)用

PyQT5中的QPainter類支持與圖元支持實(shí)現(xiàn)圖形繪制
評(píng)論