原文鏈接: https://blog.csdn.net/marwenx/article/details/116158966
pyqt支持一些簡單的畫圖操作,比如畫點或者畫線等一些簡單的操作。
首先是原理,就是重寫paintEvent()方法實現畫圖(可能接觸pyqt不久的話對這種實現方式感覺有點奇怪,建議先別管背后的原理,不是說就不學原理了,先會用再去關注原理,前期可以完成任務,學會原理后出現問題后,定位相關問題也比較容易)
pyqt對這種畫圖操作並不是提供一個直接使用的方法,而是需要重寫一個方法,並且具體調用的過程也隱藏了起來,這就讓新手和后面定位問題帶來了些許麻煩。
以下是demo
畫點
首先是需要import的
# 需要import qt相關的
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QColor, QPen
# 需要import 其他
import sys
import random
完整demo代碼
# -*- coding: utf-8 -*-
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QColor, QPen
import sys
import random
class ExcelWindow(QWidget):
def __init__(self):
super(ExcelWindow,self).__init__()
self.init_ui()
def init_ui(self):
self.resize(200,200)
def paintEvent(self, event):
qp = QPainter()
qp.begin(self)
# 繪圖的方法就寫在這里就好,begin與end之間
self.drewDot(qp)
qp.end()
def drewDot(self,qp):
pen = QPen(QColor(238,0,0),3)
qp.setPen(pen) # 對畫筆進行設置,QColor參數為顏色的rgb值,后面3為點的大小
print(self.size()) # 確認下能畫畫的畫布像素范圍
# 隨機畫幾個點
for i in range(20):
# drawPoint的參數有兩個,一個是點的橫坐標,一個是點的縱坐標
qp.drawPoint(random.randint(0,199), random.randint(0,199))
def main():
app = QApplication(sys.argv)
gui = ExcelWindow()
gui.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
然后是運行出來的結果
畫線
首先是需要import的
# 需要import qt相關的
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QColor, QPen
# 需要import 其他
import sys
import random
完整demo代碼
# -*- coding: utf-8 -*-
from PyQt5.QtWidgets import QWidget, QApplication
from PyQt5.QtGui import QPainter, QColor, QPen
from PyQt5.QtCore import Qt
import sys
import random
'''
天依藍 #66ccff 102,204,255
初音綠 #66ffcc 102,255,204
言和綠 #99ffff 153,255,255
阿綾紅 #ee0000 238,0,0
雙子黃 #ffff00 255,255,0
'''
class ExcelWindow(QWidget):
def __init__(self):
super(ExcelWindow,self).__init__()
self.init_ui()
def init_ui(self):
self.resize(200,200)
def paintEvent(self, event):
qp = QPainter()
qp.begin(self)
# 繪圖的方法就寫在這里就好,begin與end之間
self.drewLines(qp)
qp.end()
def drewLines(self,qp):
pen = QPen(QColor(238,0,0), 2, Qt.SolidLine)
qp.setPen(pen) # 對畫筆進行設置,QColor參數為顏色的rgb值,后面2為線的寬,Qt.SolidLine是線的種類
print(self.size()) # 確認下能畫畫的畫布像素范圍
# 隨機畫幾個線段
for i in range(5):
# 四個參數分別是橫坐標的起始位置,縱坐標的起始位置,橫坐標的最終位置,縱坐標的最終位置
qp.drawLine(random.randint(0,199), random.randint(0,199), random.randint(0,199), random.randint(0,199))
def main():
app = QApplication(sys.argv)
gui = ExcelWindow()
gui.show()
sys.exit(app.exec_())
if __name__ == '__main__':
main()
畫文字
寫到這這個編輯器卡bug了,辣雞。。。。。算逑,不寫畫文字的代碼了,跟上面差不多。
順手貼下v家的色值吧
'''
天依藍 #66ccff 102,204,255
初音綠 #66ffcc 102,255,204
言和綠 #99ffff 153,255,255
阿綾紅 #ee0000 238,0,0
雙子黃 #ffff00 255,255,0
'''
然后是這個setPen的參數(設置用於繪制的筆的顏色、大小和樣式)
顏色可以用QColor,參數可以寫rgb三個值也可以直接寫qt內置的顏色
QColor(238,0,0)
QColor(Qt.green)
樣式如下表格
參數 描述
Qt.NoPen 沒有線
Qt.SolidLine 一條簡單的線
Qt.DashLine 由一些像素分隔的短線
Qt.DotLine 由一些像素分隔得點
Qt.DashDotLine 輪流交替的點和短線
Qt.DashDotDotLine 一條短線、兩個點
Qt.MPenStyle 畫筆風格的掩碼
還有這個的基本原理,新手的話看類和方法里面都沒有直接調用這個paintEvent,它怎么就能畫出來了?
一個基本的理解啊,就是這個paintEvent已經涉及到pyqt的窗口內部機制了,建議別太重度使用,它的使用機制和刷新機制都不是很容易理解的,也就是一個方法的調用和刷新很可能都不在你的控制下,當然如果理解了機制之后再使用就比較容易控制了。
首先是使用,這個paintEvent不能直接調用,而是需要重寫好相關內部的操作后等待窗口的繪制事件。
繪制的自動觸發機制如下:
窗口第一次顯示時,
窗口大小調整時,
窗口切換或遮擋,
以上操作系統會自動產生一個繪圖事件,強制這個paintEvent的運行;
繪制的”手動“觸發機制:
這里的手動不是手動操作正在運行的窗口程序,而是在程序中使用update或者repaint進行重繪
repaint()函數會強制產生一個即時的重繪事件;
update()函數只是在Qt下一次處理事件時才調用一次繪制事件
多次調用update(),Qt會把連續多次的繪制事件壓縮成一個單一的繪制事件,這樣可避免閃爍現象。
所以建議在需要重繪的時候盡量使用update,在必須實時顯示繪制的時候使用repaint
self.update()
————————————————
版權聲明:本文為CSDN博主「Marvin_Xavier」的原創文章,遵循CC 4.0 BY-SA版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/marwenx/article/details/116158966