摘要:掌握PyQt5繪圖核心控件,輕松實現窗體繪圖、文字渲染、幾何圖形繪制及圖像加載。本文附帶完整代碼示例與效果圖,助你快速上手GUI圖形開發。
繪圖基礎:為什么需要這些控件?
在GUI開發中,繪圖功能是數據可視化、游戲開發、圖像編輯等場景的核心需求。PyQt5通過以下四大類實現繪圖:
- QPainter:繪圖引擎,執行底層繪制操作
- QPen:控制線條樣式(顏色/粗細/虛線等)
- QBrush:控制填充樣式(純色/漸變/圖案)
- QPixmap:圖像加載與渲染
📌 關鍵特性:所有繪圖操作必須在paintEvent()事件中完成,通過begin()和end()方法包裹。
核心控件詳解與實戰
QPainter:繪圖引擎
核心能力:
def paintEvent(self, event):painter = QPainter(self)painter.begin(self) # 繪制操作...painter.end()
常用方法速查表:
方法 | 功能 | 示例 |
---|---|---|
drawText() | 文字渲染 | painter.drawText(rect, alignment, “文本”) |
drawEllipse() | 繪制橢圓 | painter.drawEllipse(x, y, w, h) |
fillRect() | 矩形填充 | painter.fillRect(rect, QColor(255,0,0)) |
文字繪制示例
import sys
from PyQt5.QtWidgets import QApplication,QWidget
from PyQt5.QtGui import QPainter,QColor,QFont
from PyQt5.QtCore import Qtclass Drawing(QWidget):def __init__(self,parent=None):super(Drawing,self).__init__(parent)self.setWindowTitle("在窗體中繪畫出文字例子")self.resize(300,200)self.text='歡迎學習 PyQt5'def paintEvent(self,event):painter=QPainter(self)painter.begin(self)# 自定義的繪畫方法self.drawText(event,painter)painter.end()def drawText(self,event,qp):#設置筆的顏色qp.setPen(QColor(168,34,3))#設置字體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_())
運行效果
QPen:線條控制大師
6種預定義線型對比:
- Qt.SolidLine:實線(默認)
- Qt.DashLine:虛線
- Qt.DotLine:點線
- Qt.DashDotLine:點劃線
- Qt.DashDotDotLine:雙點劃線
- Qt.CustomDashLine:自定義模式
自定義虛線技巧:
pen = QPen(Qt.red, 3)
pen.setStyle(Qt.CustomDashLine)
pen.setDashPattern([5, 2, 1, 2]) # 5px實線+2px空白+1px實線+2px空白
QBrush:填充藝術家
9種經典填充模式:
# 示例:創建不同填充樣式的矩形
patterns = [Qt.SolidPattern, # 純色填充 Qt.Dense5Pattern, # 密集斜線 Qt.DiagCrossPattern, # 交叉網格 Qt.HorPattern, # 水平線 Qt.VerPattern, # 垂直線 Qt.BDiagPattern # 反斜線
]
漸變填充進階(需配合QLinearGradient):
gradient = QLinearGradient(0, 0, 100, 100)
gradient.setColorAt(0, Qt.blue)
gradient.setColorAt(1, Qt.white)
brush = QBrush(gradient)
QPixmap:圖像處理專家
核心功能對比:
方法 | 與QImage區別 | 適用場景 |
---|---|---|
load() | 專為顯示優化 | 界面圖片加載 |
scaled() | 保持寬高比縮放 | 縮略圖生成 |
save() | 支持壓縮格式 | 截圖保存 |
圖像加載最佳實踐:
自適應標簽大小的圖像加載
pixmap = QPixmap("image.jpg")
pixmap = pixmap.scaled( label.size(), Qt.KeepAspectRatio,Qt.SmoothTransformation
)
label.setPixmap(pixmap)
性能優化建議
- 雙緩沖技術:通過QPixmap緩存繪制結果,避免閃爍
- 局部重繪:使用update(QRect)而非全局刷新
- 資源復用:重復使用的QPen/QBrush建議設為成員變量
完整項目示例
簡易畫板實現思路:
- 繼承QWidget重寫mouseMoveEvent
- 使用QPainterPath記錄筆跡
- 通過QPixmap保存畫布狀態
class SketchWidget(QWidget):def __init__(self):super().__init__()self.path = QPainterPath()self.pen = QPen(Qt.blue, 3, Qt.SolidLine)def mouseMoveEvent(self, event):self.path.lineTo(event.pos()) self.update()
📢 互動提問:你在PyQt5繪圖時遇到過哪些難題?歡迎在評論區留言討論!