1. 程式人生 > 程式設計 >python GUI庫圖形介面開發之PyQt5簡單繪圖板例項與程式碼分析

python GUI庫圖形介面開發之PyQt5簡單繪圖板例項與程式碼分析

在PyQt中常用的影象類有四種,QPixmap,QImage,QPicture,QBitmap

型別 描述
QPixmap 專門為繪圖設計的,在繪製圖片時需要使用QPixmap
QImage 提供了一個與硬體無關的影象表示函式,可以用於圖片畫素級訪問
QPicture 是一個繪圖裝置類,它繼承自QPainter類,可以使用QPainter的begin()函式在QPicture上繪圖,使用end()函式結束繪圖,使用QPicture的save()函式將QPainter所使用的繪圖指令儲存在檔案中
QBitmap 是一個繼承自QPixmap的簡單類,它提供了1bit深度的二值影象的類,QBitmap提供的單色影象,可以用來製作遊標(QCursor),或者筆刷(QBrush)

簡單繪圖板例項

# -*- coding: utf-8 -*-
import sys
from PyQt5.QtWidgets import QApplication,QWidget
from PyQt5.QtGui import QPainter,QPixmap
from PyQt5.QtCore import Qt,QPoint
class Winform(QWidget):

def __init__(self,parent=None):
super(Winform,self).__init__(parent)
#設定標題
self.setWindowTitle("繪圖例子")
#例項化QPixmap類
self.pix = QPixmap()
#起點,終點
self.lastPoint = QPoint()
self.endPoint = QPoint()
#初始化
self.initUi()
def initUi(self):
# 視窗大小設定為600*500
self.resize(600,500)
# 畫布大小為400*400,背景為白色
self.pix = QPixmap(400,400)
self.pix.fill(Qt.white)
def paintEvent(self,event):
pp = QPainter(self.pix)
# 根據滑鼠指標前後兩個位置繪製直線
pp.drawLine(self.lastPoint,self.endPoint)
# 讓前一個座標值等於後一個座標值,
# 這樣就能實現畫出連續的線
self.lastPoint = self.endPoint
painter = QPainter(self)
#繪製畫布到視窗指定位置處
painter.drawPixmap(0,self.pix)
def mousePressEvent(self,event):
# 滑鼠左鍵按下
if event.button() == Qt.LeftButton:
self.lastPoint = event.pos()
self.endPoint = self.lastPoint
def mouseMoveEvent(self,event):
# 滑鼠左鍵按下的同時移動滑鼠
if event.buttons() and Qt.LeftButton:
self.endPoint = event.pos()
# 進行重新繪製
self.update()
def mouseReleaseEvent(self,event):
# 滑鼠左鍵釋放
if event.button() == Qt.LeftButton:
self.endPoint = event.pos()
# 進行重新繪製
self.update()
if __name__ == "__main__":
app = QApplication(sys.argv)
form = Winform()
form.show()
sys.exit(app.exec_())

執行效果圖如下

python GUI庫圖形介面開發之PyQt5簡單繪圖板例項與程式碼分析

程式碼分析

在這個例子中,實現了簡單的繪圖功能,按住滑鼠左鍵在畫板上進行繪製,釋放滑鼠左鍵結束繪圖

第一組程式碼:初始化程式碼

        #例項化QPixmap類

        self.pix = QPixmap()

        #起點,終點

        self.lastPoint = QPoint()

        self.endPoint = QPoint()

        #初始化

        self.initUi()

第二組程式碼:重構paintEvent()函式

        def paintEvent(self,event):

        pp = QPainter(self.pix)

        # 根據滑鼠指標前後兩個位置繪製直線

        pp.drawLine(self.lastPoint,self.endPoint)

        # 讓前一個座標值等於後一個座標值,

        # 這樣就能實現畫出連續的線

        self.lastPoint = self.endPoint

        painter = QPainter(self)

        #繪製畫布到視窗指定位置處

        painter.drawPixmap(0,self.pix)

第三組程式碼:重構mousePressEvent()函式,使用兩個點來繪製線條,這兩個點從下面的滑鼠事件中獲取

 def mousePressEvent(self,event):

        # 滑鼠左鍵按下

        if event.button() == Qt.LeftButton:

            self.lastPoint = event.pos()

            self.endPoint = self.lastPoint

第四組程式碼:重構mouseMoveEvent()函式,當滑鼠左鍵把按下時獲得開始點,每次繪製,都讓結束點和開始點重合,這樣確保這兩個點的值都是預期值

    def mouseMoveEvent(self,event):

        # 滑鼠左鍵按下的同時移動滑鼠

        if event.buttons() and Qt.LeftButton:

            self.endPoint = event.pos()

            # 進行重新繪製

            self.update()

第五組程式碼:重構mouseReleaseEvent()函式,當滑鼠指標移動時獲得結束點,並更新繪製,注意,這裡的button()函式可以獲取在滑鼠指標移動過程中按下的所有按鍵,然後用Qt.LeftButton來判斷是否按下了左鍵,在mouseMoveEvent()中必須使用該函式來判斷按下的滑鼠按鍵,最後呼叫update()函式,會執行paintEvent()函式進行重新繪製

    def mouseReleaseEvent(self,event):

        # 滑鼠左鍵釋放

        if event.button() == Qt.LeftButton:

            self.endPoint = event.pos()

            # 進行重新繪製

            self.update()

當釋放滑鼠時,也會進行繪製,現在執行程式,按下滑鼠左鍵在白色畫布上進行繪製,實現了簡單的塗鴉板功能

本文介紹了PyQt5利用QPixmap,QImage,QPicture,QBitmap實現簡單畫板的例項,更多關於PyQt5圖形影象知識請檢視下面的相關連結