python GUI庫圖形界面開發(fā)之PyQt5簡單繪圖板實例與代碼分析
在PyQt中常用的圖像類有四種,QPixmap,QImage,QPicture,QBitmap
| 類型 | 描述 |
|---|---|
| QPixmap | 專門為繪圖設計的,在繪制圖片時需要使用QPixmap |
| QImage | 提供了一個與硬件無關的圖像表示函數(shù),可以用于圖片像素級訪問 |
| QPicture | 是一個繪圖設備類,它繼承自QPainter類,可以使用QPainter的begin()函數(shù)在QPicture上繪圖,使用end()函數(shù)結束繪圖,使用QPicture的save()函數(shù)將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)
# 根據(jù)鼠標指針前后兩個位置繪制直線
pp.drawLine(self.lastPoint, self.endPoint)
# 讓前一個坐標值等于后一個坐標值,
# 這樣就能實現(xiàn)畫出連續(xù)的線
self.lastPoint = self.endPoint
painter = QPainter(self)
#繪制畫布到窗口指定位置處
painter.drawPixmap(0, 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_())
運行效果圖如下

代碼分析
在這個例子中,實現(xiàn)了簡單的繪圖功能,按住鼠標左鍵在畫板上進行繪制,釋放鼠標左鍵結束繪圖
第一組代碼:初始化代碼
#實例化QPixmap類
self.pix = QPixmap()
#起點,終點
self.lastPoint = QPoint()
self.endPoint = QPoint()
#初始化
self.initUi()
第二組代碼:重構paintEvent()函數(shù)
def paintEvent(self, event):
pp = QPainter(self.pix)
# 根據(jù)鼠標指針前后兩個位置繪制直線
pp.drawLine(self.lastPoint, self.endPoint)
# 讓前一個坐標值等于后一個坐標值,
# 這樣就能實現(xiàn)畫出連續(xù)的線
self.lastPoint = self.endPoint
painter = QPainter(self)
#繪制畫布到窗口指定位置處
painter.drawPixmap(0, 0, self.pix)
第三組代碼:重構mousePressEvent()函數(shù),使用兩個點來繪制線條,這兩個點從下面的鼠標事件中獲取
def mousePressEvent(self, event):
# 鼠標左鍵按下
if event.button() == Qt.LeftButton:
self.lastPoint = event.pos()
self.endPoint = self.lastPoint
第四組代碼:重構mouseMoveEvent()函數(shù),當鼠標左鍵把按下時獲得開始點,每次繪制,都讓結束點和開始點重合,這樣確保這兩個點的值都是預期值
def mouseMoveEvent(self, event):
# 鼠標左鍵按下的同時移動鼠標
if event.buttons() and Qt.LeftButton:
self.endPoint = event.pos()
# 進行重新繪制
self.update()
第五組代碼:重構mouseReleaseEvent()函數(shù),當鼠標指針移動時獲得結束點,并更新繪制,注意,這里的button()函數(shù)可以獲取在鼠標指針移動過程中按下的所有按鍵,然后用Qt.LeftButton來判斷是否按下了左鍵,在mouseMoveEvent()中必須使用該函數(shù)來判斷按下的鼠標按鍵,最后調用update()函數(shù),會執(zhí)行paintEvent()函數(shù)進行重新繪制
def mouseReleaseEvent(self, event):
# 鼠標左鍵釋放
if event.button() == Qt.LeftButton:
self.endPoint = event.pos()
# 進行重新繪制
self.update()
當釋放鼠標時,也會進行繪制,現(xiàn)在運行程序,按下鼠標左鍵在白色畫布上進行繪制,實現(xiàn)了簡單的涂鴉板功能
本文介紹了PyQt5利用QPixmap,QImage,QPicture,QBitmap實現(xiàn)簡單畫板的實例,更多關于PyQt5圖形圖像知識請查看下面的相關鏈接
相關文章
Django模板獲取field的verbose_name實例
這篇文章主要介紹了Django模板獲取field的verbose_name實例,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-05-05
Python利用pyHook實現(xiàn)監(jiān)聽用戶鼠標與鍵盤事件
這篇文章主要介紹了Python利用pyHook實現(xiàn)監(jiān)聽用戶鼠標與鍵盤事件,很有實用價值的一個技巧,需要的朋友可以參考下2014-08-08
python解釋器pycharm安裝及環(huán)境變量配置教程圖文詳解
這篇文章主要介紹了python解釋器pycharm安裝及環(huán)境變量配置教程圖文詳解,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友可以參考下2020-02-02

