繪圖QPainter-畫筆


繪圖要在paintEvent()方法中實現。在QPainter對象的begin()與end()方法間編寫繪圖代碼。它會在控件或其他圖形設備上進行低級的圖形繪制

 

畫筆樣式Penstyle

Qt.Nopen      沒有線。比如QPainter.drawRect()填充,但沒有繪制任何邊界線

Qt.SolidLine  一條簡單的線    

Qt.DashLine   有一些像素分割的線    

Qt.DotLine  有一些像素分割的點    

Qt.DashDotLine   輪流交替的點和短線      

Qt.DashDotDotLine  一條短線,兩個點    

Qt.MpenStyle   畫筆風格的掩碼     

Qt.CustomDashLine   自定義樣式   

  

 

 三種筆端樣式:

 

線條連接方式,一共有三種:

 

 

 

 

 

 1 import sys
 2 from PyQt5.QtCore import Qt
 3 from PyQt5.QtGui import QPainter, QPen,QPolygon,QColor
 4 from PyQt5.QtWidgets import QApplication, QWidget
 5 
 6 
 7 class Demo(QWidget):
 8     def __init__(self):
 9         super(Demo, self).__init__()
10         self.resize(600, 600)
11 
12         self.pen1 = QPen() # 實例化畫筆對象
13         self.pen1.setColor(Qt.green) #設置畫筆顏色
14         self.pen2 = QPen(Qt.SolidLine) #實例化畫筆對象.參數:畫筆樣式
15         self.pen2.setWidth(3) #設置畫筆粗細
16         #傳入整型值,默認為1。如果要傳入浮點型的話可使用setWidthF()
17         # self.pen2.setWidthF(3.3)
18 
19         self.pen3 = QPen(Qt.DashLine)
20         self.pen4 = QPen(Qt.DotLine)
21         self.pen5 = QPen(Qt.DashDotLine)
22         self.pen6 = QPen(Qt.DashDotDotLine)
23         self.pen7 = QPen(Qt.CustomDashLine) 24         #自定義樣式的話,我們之后還需要調用setDashPattern()方法來設置虛線模式。只要傳入一個迭代器即可,這里我們傳入[6, 2, 18, 2](元素數量為偶數)這個列表,意思是我們想將第一個虛線長度設為6個像素,再設置空白間隔長度為2個像素,之后再畫一條長度為18像素的虛線,最后再加個長度為2像素的空白間隔,如此循環
25         self.pen7.setDashPattern([6, 2, 18, 2]) 26 
27         self.pen8 = QPen(Qt.SolidLine)
28         self.pen8.setWidth(6)
29         self.pen8.setCapStyle(Qt.RoundCap) #設置筆端樣式
30 
31         self.pen9 = QPen(Qt.SolidLine)
32         self.pen9.setWidthF(3)
33         self.pen9.setJoinStyle(Qt.MiterJoin) #設置線條連接方式
34 
35     def paintEvent(self, QPaintEvent): #繪畫事件
36         painter = QPainter(self) # 實例化一個畫布【個人:畫布指令只能在繪圖事件中】
37         painter.setPen(self.pen1) #給畫布設置畫筆
38         painter.drawLine(100, 10, 500, 10) #畫直線。參數:兩個點的坐標
39         #繪制一條指定了端點坐標的線,繪制從(x1,y1)到(x2,y2)的直線並且設置當前畫筆位置為(x2,y2)     #painter.drawLine(self.begin_point, self.end_point)   #畫直線      #參數是QPoint點坐標對象對象
40         # painter.setPen(self.pen2)
41         # painter.drawLine(100, 30, 500, 30)
42         #
43         # painter.setPen(self.pen3)
44         # painter.drawLine(100, 50, 500, 50)
45         #
46         # painter.setPen(self.pen4)
47         # painter.drawLine(100, 70, 500, 70)
48         #
49         # painter.setPen(self.pen5)
50         # painter.drawLine(100, 90, 500, 90)
51         #
52         # painter.setPen(self.pen6)
53         # painter.drawLine(100, 110, 500, 110)
54         #
55         # painter.setPen(self.pen7)
56         # painter.drawLine(100, 130, 500, 130)
57         #
58         # painter.setPen(self.pen8)
59         # painter.drawLine(100, 150, 500, 150)
60 
61         painter.setPen(self.pen2)
62         #painter.drawRect(100, 50, 400, 100) # 畫矩形
63         #參數1 參數2:矩形左上角坐標
64         #參數3 參數4 寬度  高度
65 
66         #painter.drawArc(0,0,200,200,0*16,90*16) #畫弧形
67         #參數1 參數2  矩形左上角坐標
68         #參數3 參數4 矩形的寬和高
69         #參數5 參數6  0  90 是角度
70 
71         #painter.drawEllipse(0, 0, 200, 100) #畫橢圓
72         #參數1 參數2  矩形左上角坐標
73         #參數3 參數4 矩形的寬和高
74 
75         # polygon = QPolygon()  #實例化一個多邊形
76         # polygon.setPoints(5, 100, 100, 140, 130, 160, 160, 170, 140, 140, 178,0)
77         # #給多邊形按順序加坐標
78         # painter.drawPolygon(polygon) #畫多邊形
79 
80         #painter.drawPie(100, 100, 200, 200, 0 * 16, 90 * 16) #畫扇形
81         # 參數1 參數2  矩形左上角坐標
82         # 參數3 參數4 矩形的寬和高
83         #0  90  是角度
84 
85         painter.fillRect(100, 50, 400, 100,QColor(Qt.red)) #填充矩形
86         # 參數1 參數2  矩形左上角坐標
87         # 參數3 參數4 矩形的寬和高
88         #參數5  填充色
89 
90 
91 if __name__ == '__main__':
92     app = QApplication(sys.argv)
93     demo = Demo()
94     demo.show()
95     sys.exit(app.exec_())

 

 

 

 qp.drawPoint(x, y)     #畫點

painter.drawRect(rect)   #畫矩形

參數:QRect對象
  

 

 

 

觸發繪圖事件

1.在窗口部件第一次顯示時,系統會自動產生一個繪圖事件,從而強制繪制這個窗口部件
2.當重新調整窗口部件的大小時,系統也會產生一個繪制事件
3.當窗口部件被其他窗口部件遮擋,然后又再次顯示出來的時候,就會對那些隱藏的區域產生一個繪制事件
4.同時可以調用QWidget::update()或者QWidget::repaint()來強制產生一個繪制事件。二者的區別是:
repaint()被調用之后,立即執行重繪.update()調用之后並不是立即重繪,而是將重繪事件放入主消息循環中,由main的event loop來統一調度的(其實也是比較快的)。update在調用paintEvent之前,還做了很多優化,如果update被調用了很多次,最后這些 update會合並到一個大的重繪事件加入到消息隊列,最后只有這個大的update被執行一次

注意:再次調用繪圖事件后,原有的繪圖全部清除

 

def paintEvent(self, QPaintEvent):帶設備參數時會立即開始在設備上繪制,自動調用begin()函數,然后析構函數中調用end()函數結束繪制

              不帶設備參數時,可以在后面調用QPainter::begin(QPaintDevice *device)來指定繪制設置,然后用完再調用end()函數

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM