繪圖要在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()函數