python GUI庫圖形界面開發(fā)之PyQt5簡(jiǎn)單繪圖板實(shí)例與代碼分析
在PyQt中常用的圖像類有四種,QPixmap,QImage,QPicture,QBitmap
類型 描述 QPixmap 專門為繪圖設(shè)計(jì)的,在繪制圖片時(shí)需要使用QPixmap QImage 提供了一個(gè)與硬件無關(guān)的圖像表示函數(shù),可以用于圖片像素級(jí)訪問 QPicture 是一個(gè)繪圖設(shè)備類,它繼承自QPainter類,可以使用QPainter的begin()函數(shù)在QPicture上繪圖,使用end()函數(shù)結(jié)束繪圖,使用QPicture的save()函數(shù)將QPainter所使用的繪圖指令保存在文件中 QBitmap 是一個(gè)繼承自QPixmap的簡(jiǎn)單類,它提供了1bit深度的二值圖像的類,QBitmap提供的單色圖像,可以用來制作游標(biāo)(QCursor),或者筆刷(QBrush) 簡(jiǎn)單繪圖板實(shí)例# -*- coding: utf-8 -*-import sysfrom PyQt5.QtWidgets import QApplication, QWidgetfrom PyQt5.QtGui import QPainter, QPixmapfrom PyQt5.QtCore import Qt, QPointclass Winform(QWidget):def __init__(self, parent=None):super(Winform, self).__init__(parent)#設(shè)置標(biāo)題self.setWindowTitle('繪圖例子')#實(shí)例化QPixmap類self.pix = QPixmap()#起點(diǎn),終點(diǎn)self.lastPoint = QPoint()self.endPoint = QPoint()#初始化self.initUi()def initUi(self):# 窗口大小設(shè)置為600*500self.resize(600, 500)# 畫布大小為400*400,背景為白色self.pix = QPixmap(400, 400)self.pix.fill(Qt.white)def paintEvent(self, event):pp = QPainter(self.pix)# 根據(jù)鼠標(biāo)指針前后兩個(gè)位置繪制直線pp.drawLine(self.lastPoint, self.endPoint)# 讓前一個(gè)坐標(biāo)值等于后一個(gè)坐標(biāo)值,# 這樣就能實(shí)現(xiàn)畫出連續(xù)的線self.lastPoint = self.endPointpainter = QPainter(self)#繪制畫布到窗口指定位置處painter.drawPixmap(0, 0, self.pix)def mousePressEvent(self, event):# 鼠標(biāo)左鍵按下if event.button() == Qt.LeftButton:self.lastPoint = event.pos()self.endPoint = self.lastPointdef mouseMoveEvent(self, event):# 鼠標(biāo)左鍵按下的同時(shí)移動(dòng)鼠標(biāo)if event.buttons() and Qt.LeftButton:self.endPoint = event.pos()# 進(jìn)行重新繪制self.update()def mouseReleaseEvent(self, event):# 鼠標(biāo)左鍵釋放if event.button() == Qt.LeftButton:self.endPoint = event.pos()# 進(jìn)行重新繪制self.update()if __name__ == '__main__':app = QApplication(sys.argv)form = Winform()form.show()sys.exit(app.exec_())
運(yùn)行效果圖如下

在這個(gè)例子中,實(shí)現(xiàn)了簡(jiǎn)單的繪圖功能,按住鼠標(biāo)左鍵在畫板上進(jìn)行繪制,釋放鼠標(biāo)左鍵結(jié)束繪圖
第一組代碼:初始化代碼
#實(shí)例化QPixmap類
self.pix = QPixmap()
#起點(diǎn),終點(diǎn)
self.lastPoint = QPoint()
self.endPoint = QPoint()
#初始化
self.initUi()
第二組代碼:重構(gòu)paintEvent()函數(shù)
def paintEvent(self, event):
pp = QPainter(self.pix)
# 根據(jù)鼠標(biāo)指針前后兩個(gè)位置繪制直線
pp.drawLine(self.lastPoint, self.endPoint)
# 讓前一個(gè)坐標(biāo)值等于后一個(gè)坐標(biāo)值,
# 這樣就能實(shí)現(xiàn)畫出連續(xù)的線
self.lastPoint = self.endPoint
painter = QPainter(self)
#繪制畫布到窗口指定位置處
painter.drawPixmap(0, 0, self.pix)
第三組代碼:重構(gòu)mousePressEvent()函數(shù),使用兩個(gè)點(diǎn)來繪制線條,這兩個(gè)點(diǎn)從下面的鼠標(biāo)事件中獲取
def mousePressEvent(self, event):
# 鼠標(biāo)左鍵按下
if event.button() == Qt.LeftButton:
self.lastPoint = event.pos()
self.endPoint = self.lastPoint
第四組代碼:重構(gòu)mouseMoveEvent()函數(shù),當(dāng)鼠標(biāo)左鍵把按下時(shí)獲得開始點(diǎn),每次繪制,都讓結(jié)束點(diǎn)和開始點(diǎn)重合,這樣確保這兩個(gè)點(diǎn)的值都是預(yù)期值
def mouseMoveEvent(self, event):
# 鼠標(biāo)左鍵按下的同時(shí)移動(dòng)鼠標(biāo)
if event.buttons() and Qt.LeftButton:
self.endPoint = event.pos()
# 進(jìn)行重新繪制
self.update()
第五組代碼:重構(gòu)mouseReleaseEvent()函數(shù),當(dāng)鼠標(biāo)指針移動(dòng)時(shí)獲得結(jié)束點(diǎn),并更新繪制,注意,這里的button()函數(shù)可以獲取在鼠標(biāo)指針移動(dòng)過程中按下的所有按鍵,然后用Qt.LeftButton來判斷是否按下了左鍵,在mouseMoveEvent()中必須使用該函數(shù)來判斷按下的鼠標(biāo)按鍵,最后調(diào)用update()函數(shù),會(huì)執(zhí)行paintEvent()函數(shù)進(jìn)行重新繪制
def mouseReleaseEvent(self, event):
# 鼠標(biāo)左鍵釋放
if event.button() == Qt.LeftButton:
self.endPoint = event.pos()
# 進(jìn)行重新繪制
self.update()
當(dāng)釋放鼠標(biāo)時(shí),也會(huì)進(jìn)行繪制,現(xiàn)在運(yùn)行程序,按下鼠標(biāo)左鍵在白色畫布上進(jìn)行繪制,實(shí)現(xiàn)了簡(jiǎn)單的涂鴉板功能
本文介紹了PyQt5利用QPixmap,QImage,QPicture,QBitmap實(shí)現(xiàn)簡(jiǎn)單畫板的實(shí)例,更多關(guān)于PyQt5圖形圖像知識(shí)請(qǐng)查看下面的相關(guān)鏈接
相關(guān)文章:
1. ASP中實(shí)現(xiàn)字符部位類似.NET里String對(duì)象的PadLeft和PadRight函數(shù)2. vue前端RSA加密java后端解密的方法實(shí)現(xiàn)3. php使用正則驗(yàn)證密碼字段的復(fù)雜強(qiáng)度原理詳細(xì)講解 原創(chuàng)4. JSP+Servlet實(shí)現(xiàn)文件上傳到服務(wù)器功能5. vue項(xiàng)目登錄成功拿到令牌跳轉(zhuǎn)失敗401無登錄信息的解決6. 基于javaweb+jsp實(shí)現(xiàn)企業(yè)財(cái)務(wù)記賬管理系統(tǒng)7. asp批量添加修改刪除操作示例代碼8. ASP動(dòng)態(tài)網(wǎng)頁制作技術(shù)經(jīng)驗(yàn)分享9. CSS可以做的幾個(gè)令你嘆為觀止的實(shí)例分享10. 淺談?dòng)蓀osition屬性引申的css進(jìn)階討論

網(wǎng)公網(wǎng)安備