本篇博文主要介紹如何實現(xiàn)在窗口中繪圖讼油,在 PyQt5中杰赛,一般可以通過QPainter呢簸、QPen矮台、QBrush和QPixmap這四個類來實現(xiàn)繪圖功能。其中根时,QPixmap的作用是加載并呈現(xiàn)本地圖像瘦赫,而圖像的呈現(xiàn)本質(zhì)上也是通過繪圖方式實現(xiàn)的。
1蛤迎、QPainter繪圖類
QPainter類在QWidget(控件)上執(zhí)行繪圖操作确虱,它是一個繪制工具,為大部分圖形界面提供了高度優(yōu)化的函數(shù)替裆,使QPainter類可以繪制從簡單的直線到復(fù)雜的餅圖等校辩。
繪制操作在QWidget.paintEvent()中完成窘问,繪制方法必須放在QtGui.QPainter對象的begin()和end()之間QPainter類在控件或其他繪圖設(shè)備上執(zhí)行較低級別的圖形繪制功能,并通過如下表所示的方法進行繪制:
還可以設(shè)置畫筆風(fēng)格(PenStyle)宜咒,這是一個枚舉類惠赫,可以由QPainter類繪制。畫筆風(fēng)格如下表所示:
畫筆效果如下所示:
來看看QPainter繪圖類的示例故黑,效果如下所示:
示例中儿咱,首先定義了待繪制的文字,代碼如下所示:
self.text = '公眾號:美男子玩編程'
然后场晶,定義了一個繪制事件混埠,所有的繪制操作都發(fā)生在此事件內(nèi)。繪制事件代碼如下所示:
def paintEvent(self,event):
painter = QPainter(self)? ? ? ?
painter.begin(self)
? ? ? ? # 自定義的繪畫方法
self.drawText(event, painter)
painter.end()
QtGui.QPainter類負責(zé)所有低級別的繪制诗轻,所有的繪制方法都要放在begin()和end()之間钳宪。這個例子放置的是自定義的drawText()方法。自定義的繪制方法代碼如下所示:
def drawText(self, event, qp):
? ? ? ? # 設(shè)置筆的顏色
qp.setPen( QColor(168, 34, 3) )
? ? ? ? # 設(shè)置字體
qp.setFont( QFont('SimSun', 20))
? ? ? ? # 畫出文本
qp.drawText(event.rect(), Qt.AlignCenter, self.text)
實現(xiàn)代碼如下所示:
import sys
from PyQt5.QtWidgets import QApplication? ,QWidget
from PyQt5.QtGui import QPainter ,QColor ,QFont
from PyQt5.QtCore import Qt
class Drawing(QWidget):
def __init__(self,parent=None):
super(Drawing,self).__init__(parent)
self.setWindowTitle("在窗體中繪畫出文字例子")
self.resize(300, 200)? ? ? ?
self.text = '公眾號:美男子玩編程'
def paintEvent(self,event):
painter = QPainter(self)? ? ? ?
painter.begin(self)
? ? ? ? # 自定義的繪畫方法
self.drawText(event, painter)
painter.end()
def drawText(self, event, qp):
? ? ? ? # 設(shè)置筆的顏色
qp.setPen( QColor(168, 34, 3) )
? ? ? ? # 設(shè)置字體
qp.setFont( QFont('SimSun', 20))
? ? ? ? # 畫出文本
qp.drawText(event.rect(), Qt.AlignCenter, self.text)
if __name__ == "__main__":?
app = QApplication(sys.argv)
demo = Drawing()
demo.show()
sys.exit(app.exec_())
QPainter繪制文字扳炬,實質(zhì)上文字在屏幕上的顯示是由一個個點(point)組成的使套,來看看QPainter如何繪制點。效果如下所示:
示例中鞠柄,在窗口的工作區(qū)繪制正弦函數(shù)圖形侦高,周期是[-100,100]。畫筆設(shè)置為紅色厌杜,使用預(yù)定義的Qt.red顏色奉呛。每次調(diào)整窗口大小時,都會生成一個繪圖事件夯尽。使用size()方法得到窗口的當(dāng)前大小瞧壮,在新的窗口中隨機分布工作區(qū)中的點。最后使用drawPoint()方法繪制一個個點匙握。
實現(xiàn)代碼如下所示:
import sys, math
from PyQt5.QtWidgets import *?
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt
class Drawing(QWidget):
def __init__(self, parent=None):
super(Drawing, self).__init__(parent)
self.resize(300, 200)?
self.setWindowTitle("在窗體中畫點")? ? ? ?
def paintEvent(self, event):
qp = QPainter()
qp.begin(self)
# 自定義畫點方法
self.drawPoints(qp)
qp.end()
def drawPoints(self,? qp):
qp.setPen( Qt.red)
size = self.size()
for i in range(1000):
# [-100, 100]兩個周期的正弦函數(shù)圖像
x = 100 *(-1+2.0*i/1000)+ size.width()/2.0
y = -50 * math.sin((x - size.width()/2.0)*math.pi/50) + size.height()/2.0
qp.drawPoint(x, y)
if __name__ == '__main__':
app = QApplication(sys.argv)
demo? = Drawing()
demo.show()
sys.exit(app.exec_())
2咆槽、QPen繪圖類
QPen(鋼筆)是一個基本的圖形對象,用于繪制直線圈纺、曲線或者給輪廓畫出矩形秦忿、橢圓形、多邊形及其他形狀等蛾娶。
來看看QPen繪圖類的示例灯谣,效果如下所示:
示例中,使用6種不同的線條樣式繪制了6條線蛔琅,其中前5條線使用的是預(yù)定義的線條樣式胎许。也可以自定義線條樣式,最后一條線就是使用自定義的線條樣式繪制的。
以下代碼創(chuàng)建了一個QPen對象辜窑。為了能更清晰地看清各線之間的差異钩述,將顏色設(shè)置成黑色,寬度設(shè)置為2像素(px)穆碎。Qt.SolidLine是預(yù)定義的線條樣式之一切距。
pen = QPen(Qt.black, 2, Qt.SolidLine)
以下代碼自定義了一種線條樣式。使用Qt.customDashLine創(chuàng)建線條樣式惨远,然后調(diào)用setDashPattern()方法使用數(shù)字列表定義樣式谜悟。數(shù)字列表的個數(shù)必須是偶數(shù),在本例中數(shù)字列表是[1,4,5,4]北秽,它的個數(shù)是4葡幸。在數(shù)字列表中,奇數(shù)位(數(shù)字列表中的第1,3,5等位置)代表一段橫線贺氓,偶數(shù)位(數(shù)字列表中的第2,4,6等位置)代表兩段橫線之間的空余距離蔚叨。在數(shù)字列表中數(shù)字越大,橫線和空余距離就越大辙培。本例中數(shù)字列表[1,4,5,4]代表的意義是:1像素寬度的橫線蔑水,4像素寬度的空余距離,5像素寬度的橫線扬蕊,4像素寬度的空余距離搀别。
pen.setStyle(Qt.CustomDashLine)
pen.setDashPattern([1, 4, 5, 4])
qp.setPen(pen)
qp.drawLine(20, 240, 250, 240)
實現(xiàn)代碼如下所示:
import sys
from PyQt5.QtWidgets import *?
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt
class Drawing(QWidget):
def __init__(self):
super().__init__()
self.initUI()
def initUI(self):?
self.setGeometry(300, 300, 280, 270)
self.setWindowTitle('鋼筆樣式例子')? ? ? ?
def paintEvent(self, e):
qp = QPainter()
qp.begin(self)
self.drawLines(qp)
qp.end()
def drawLines(self, qp):
pen = QPen(Qt.black, 2, Qt.SolidLine)
qp.setPen(pen)
qp.drawLine(20, 40, 250, 40)
pen.setStyle(Qt.DashLine)
qp.setPen(pen)
qp.drawLine(20, 80, 250, 80)
pen.setStyle(Qt.DashDotLine)
qp.setPen(pen)
qp.drawLine(20, 120, 250, 120)
pen.setStyle(Qt.DotLine)
qp.setPen(pen)
qp.drawLine(20, 160, 250, 160)
pen.setStyle(Qt.DashDotDotLine)
qp.setPen(pen)
qp.drawLine(20, 200, 250, 200)
pen.setStyle(Qt.CustomDashLine)
pen.setDashPattern([1, 4, 5, 4])
qp.setPen(pen)
qp.drawLine(20, 240, 250, 240)
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Drawing()
demo.show()
sys.exit(app.exec_())
3、QBrush繪圖類
QBrush(畫刷)是一個基本的圖形對象尾抑,用于填充如矩形歇父、橢圓形或多邊形等形狀。QBrush有三種類型:預(yù)定義再愈、過渡和紋理圖案榜苫。
來看看QBrush繪圖類的示例,效果如下所示:
在這個例子中翎冲,在窗口中繪制出9種不同背景填充的矩形垂睬。定義QBrush 對象,然后將QPainter對象的畫刷設(shè)置成QBrush 對象抗悍,并通過調(diào)用drawRect()方法繪制矩形驹饺。
實現(xiàn)代碼如下所示:
import sys
from PyQt5.QtWidgets import *?
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt
class Drawing(QWidget):
def __init__(self):
super().__init__()?
self.initUI()
def initUI(self):?
self.setGeometry(300, 300, 365, 280)
self.setWindowTitle('畫刷例子')? ? ? ?
self.show()
def paintEvent(self, e):
qp = QPainter()
qp.begin(self)
self.drawLines(qp)
qp.end()
def drawLines(self, qp):
brush = QBrush(Qt.SolidPattern)
qp.setBrush(brush)
qp.drawRect(10, 15, 90, 60)
brush = QBrush(Qt.Dense1Pattern)
qp.setBrush(brush)
qp.drawRect(130, 15, 90, 60)
brush = QBrush(Qt.Dense2Pattern)
qp.setBrush(brush)
qp.drawRect(250, 15, 90, 60)
brush = QBrush(Qt.Dense3Pattern)
qp.setBrush(brush)
qp.drawRect(10, 105, 90, 60)
brush = QBrush(Qt.DiagCrossPattern)
qp.setBrush(brush)
qp.drawRect(10, 105, 90, 60)
brush = QBrush(Qt.Dense5Pattern)
qp.setBrush(brush)
qp.drawRect(130, 105, 90, 60)
brush = QBrush(Qt.Dense6Pattern)
qp.setBrush(brush)
qp.drawRect(250, 105, 90, 60)
brush = QBrush(Qt.HorPattern)
qp.setBrush(brush)
qp.drawRect(10, 195, 90, 60)
brush = QBrush(Qt.VerPattern)
qp.setBrush(brush)
qp.drawRect(130, 195, 90, 60)
brush = QBrush(Qt.BDiagPattern)
qp.setBrush(brush)
qp.drawRect(250, 195, 90, 60)
if __name__ == '__main__':
app = QApplication(sys.argv)
demo = Drawing()
demo.show()
sys.exit(app.exec_())
4、QPixmap繪圖類
QPixmap類用于繪圖設(shè)備的圖像顯示檐春,它可以作為一個QPaintDevice對象逻淌,也可以加載到一個控件中么伯,通常是標(biāo)簽或按鈕疟暖,用于在標(biāo)簽或按鈕上顯示圖像。
QPixmap可以讀取的圖像文件類型有BMP、GIF俐巴、JPG骨望、JPEG、PNG欣舵、PBM擎鸠、PGM、PPM缘圈、XBM劣光、XPM等。
QPixmap類中的常用方法如下表所示:
示例中糟把,使用setPixmap()將圖像顯示在QLabel上绢涡。實現(xiàn)代碼如下所示:
實現(xiàn)代碼如下所示:
import sys
from PyQt5.QtCore import *
from PyQt5.QtGui import *
from PyQt5.QtWidgets import *
if __name__ == '__main__':
app = QApplication(sys.argv)
win = QWidget()
lab1 = QLabel()
lab1.setPixmap(QPixmap("./2.jpg"))
vbox=QVBoxLayout()
vbox.addWidget(lab1)
win.setLayout(vbox)
win.setWindowTitle("QPixmap 例子")
win.show()
sys.exit(app.exec_())