Python版本3.7
PySide2 Version: 5.14.1
官方文檔:http://doc.qt.io/qtforpython/index.html
如果要進行繪圖操作势就,就需要了解一下QPainter
類和QPaintDevice
類哨鸭。QPainter
類的對象主要用于執(zhí)行具體的操作叁温,比如畫一條直線淋样,畫一個圓骚腥,畫一幅圖像等等咨察。QPaintDevice
類代表可以進行繪制的類,所有你在界面上能看見的控件都可以是一個QPaintDevice
(因為都是可以繪制的)螃成,實際上所有可見的控件都繼承了QPaintDevice
類呕臂。這么多種類的設備該如何統(tǒng)一進行繪制淡喜,就需要QPaintEngine
類提供統(tǒng)一的接口,一般都是在QPainter
和QPaintDevice
內(nèi)部進行使用诵闭,一般情況下對我們都是透明的(不用太在意這個類)。
既然可見控件都是一個可以繪圖的設備澎嚣,那么應該在哪里進行自定義繪制疏尿,看下面一個例子。
from PySide2.QtWidgets import QWidget, QApplication
from PySide2.QtGui import QPainter, QBrush, QColor
from PySide2.QtCore import Qt, QRect
class MyWidget(QWidget):
def __init__(self, parent=None):
super().__init__(parent)
self.setFixedSize(300, 200)
def paintEvent(self, event):
# 注意設置對象易桃,不然painter不知道在哪畫
painter = QPainter(self)
# 下面兩行等效上面一行
# painter = QPainter()
# painter.begin(self)
# 設置藍色的畫筆
painter.setPen(Qt.blue)
rectangle = QRect(10, 20, 80, 60)
# 繪制矩形區(qū)域
painter.drawRect(rectangle)
# 填充矩形區(qū)域褥琐,使用藍色的刷子
painter.fillRect(rectangle, QBrush(QColor(Qt.blue)))
app = QApplication()
window = MyWidget()
window.show()
app.exec_()
運行截圖:
注意對于上面的例子,當繪圖設備是一個widget的時候晤郑,QPainter
只能在繪圖事件中(paintEvent
)中進行使用敌呈。判斷當前painter是否可用可以使用QPainter
類里面提供的isActive()
函數(shù),如果可用會返回True造寝,否則False磕洪。在其它一些地方可能會看見使用begin(arg_1)
方法,該方法傳入一個需要繪制設備的對象诫龙,表示準備在該設備上進行繪圖析显,結(jié)束繪圖可以調(diào)用end()
,一般情況下签赃,釋放painter時會自動進行調(diào)用谷异。通過自定義繪圖,我們便可以設計出各種漂亮的控件锦聊。
什么時候會調(diào)用paintEvent
歹嘹?當repaint()
或update()
函數(shù)被調(diào)用的時候,系統(tǒng)會調(diào)用paintEvent
孔庭。
再來看一個例子:
from PySide2.QtWidgets import QApplication, QLabel
from PySide2.QtGui import QPixmap, QPainter
from PySide2.QtCore import QRect
app = QApplication()
# 生成一個QPixmap對象
image = QPixmap('image.jpg')
painter = QPainter()
painter.begin(image)
rectangle = QRect(100, 150, 100, 100)
painter.drawRect(rectangle)
painter.end()
label = QLabel()
# 設置標簽起始位置和大小
label.setGeometry(50, 50, 800, 800)
# 用來設置圖像
label.setPixmap(image)
label.show()
app.exec_()
image.jpg圖片如下:
效果圖:
看左上角尺上,在這個圖像上畫了一個矩形。
因為這個繪圖是直接在圖像上繪圖史飞,而不是在widget上(代碼中的label只是用來顯示)尖昏,所以可以在paintEvent
以外進行操作。