目录
感觉本讲用处不大,学习时可先跳过
绘图API:
1.文本
2.各种图形(直线,点,椭圆,弧,扇形,多边形等)
3.图像
QPainter
过程:
painter = QPainter()
painter. begin()
painter. drawText(...)
painter. end()
必须在paintEvent事件方法(此方法窗口自动调用,创建窗口或窗口尺寸变化时)中绘制各种元素
绘制文本
代码:
import sys
from PyQt5.QtWidgets import QApplication,QWidget
from PyQt5.QtGui import QPainter,QColor,QFont
from PyQt5.QtCore import Qt
class DrawText(QWidget):
def __init__(self):
super(DrawText, self).__init__()
self.setWindowTitle('再窗口上绘制文本')
self.resize(300,200)
self.text='深海鱼子酱'
def paintEvent(self,event):
painter=QPainter(self)
painter.begin(self)
print('窗口大小改变,此方法会不断调用')
#画笔
painter.setPen(QColor(150,43,5))#RGB
# 字体,字号
painter.setFont(QFont('SimSun',25))
#绘图区域,居中,绘制文本
painter.drawText(event.rect(),Qt.AlignCenter,self.text)
painter.end()
if __name__=='__main__':
app=QApplication(sys.argv)
main=DrawText()
main.show()
sys.exit(app.exec_())
运行结果:
用像素点绘制正弦曲线
代码:
'''
用像素点绘制正弦曲线
-2PI 2PI
drawPoint(x,y)
'''
import sys,math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt
class DrawPoints(QWidget):
def __init__(self):
super(DrawPoints,self).__init__()
self.resize(500,300)
self.setWindowTitle('在窗口上用像素点绘制2个周期的正弦曲线')
def paintEvent(self, event):
painter = QPainter() # 定义画图对象
painter.begin(self) # 开始画图
painter.setPen(Qt.blue)
size = self.size()
for i in range(1000):
x = 100 * (-1 + 2.0 * i/1000) + size.width()/2.0 #加上size.width()/2.0是将绘制图像原点挪到窗口中间
y = -50 * math.sin((x - size.width()/2.0) * math.pi/50) + size.height()/2.0
painter.drawPoint(x,y) # 说是曲线,其实是画了1000个点,看上去有点像曲线
painter.end() # 结束画图
if __name__ == '__main__':
app = QApplication(sys.argv)
main = DrawPoints()
main.show()
sys.exit(app.exec_())
运行结果:
bug:
math底下标着红线,导入的时候没有math这个包,但换成cmath却不行
原因:
库的功能有些不同,math允许您访问实数的双曲线,三角函数和对数函数,而cmath允许您使用复数。
但是为什么math明明没有却能使用呢?
可能是因为math库是python提供的内置数学类函数库
绘制不同类型的直线
代码:
import sys
from PyQt5.QtWidgets import QApplication,QWidget
from PyQt5.QtGui import QPainter,QColor,QFont,QPen
from PyQt5.QtCore import Qt
class DrawMutilLine(QWidget):
def __init__(self):
super(DrawMutilLine, self).__init__()
self.setWindowTitle('设置Pen的样式')
self.resize(350,250)
def paintEvent(self,event):
painter=QPainter()
painter.begin(self)
#颜色,粗细,画笔类型
pen=QPen(Qt.red,3,Qt.SolidLine)#最后一个参数是实线
painter.setPen(pen)
painter.drawLine(20,40,250,40)
pen.setStyle(Qt.DashLine)
painter.setPen(pen)#切记设置完style之后,要再将pen设置一遍,否则不会起作用
painter.drawLine(20, 80, 250, 80)
pen.setStyle(Qt.DashDotDotLine)
painter.setPen(pen)
painter.drawLine(20, 120, 250, 120)
pen.setStyle(Qt.DotLine)
painter.setPen(pen)
painter.drawLine(20, 160, 250, 160)
pen.setStyle(Qt.CustomDashLine)
pen.setDashPattern([1,10,5,10])#线长度,间隔长度,线长度,间隔长度
painter.setPen(pen)
painter.drawLine(20, 200, 250, 200)
painter.end()
if __name__=='__main__':
app=QApplication(sys.argv)
main=DrawMutilLine()
main.show()
sys.exit(app.exec_())
运行结果:
绘制各种图形
绘制各种图形
弧
圆形
椭圆
矩形(正方形)
多边形
绘制图像
代码:
import sys
from PyQt5.QtWidgets import QApplication,QWidget
from PyQt5.QtGui import QPainter, QPolygon, QImage
from PyQt5.QtCore import Qt, QRect, QPoint
import os
class DrawAll(QWidget):
def __init__(self):
super(DrawAll, self).__init__()
self.setWindowTitle('绘制各种图形')
self.resize(400,600)
def paintEvent(self,event):
qp=QPainter(self)
qp.begin(self)
qp.setPen(Qt.blue)
#绘制弧
#左上角坐标,宽,高
rect=QRect(0,10,100,100)
#绘制区域(在其中绘制,起始角度,结束角度)
#alen:一个alen等于1/16度,eg:画45°的弧就是45*16
qp.drawArc(rect,0, 50 * 16)
#通过弧绘制圆
qp.setPen(Qt.red)
#rect也可直接当参数传进去
qp.drawArc(120,10,100,100,0,360*16)
#绘制带弦的弧
rect1=QRect(10,120,100,100)
qp.drawChord(rect1,12,130*16)
#绘制扇形
rect2=QRect(10,240,100,100)
qp.drawPie(rect2,12,130*16)
#椭圆(不需要指定角度)
# 宽和高肯定是不一样的,如果一样就是圆了,所以绘制圆可以通过椭圆,也可以通过弧
qp.drawEllipse(120,120,150,100)
#绘制多边形
#五边形,需要五个点
point1=QPoint(140,380)
point2=QPoint(270,420)
point3=QPoint(290,512)
point4=QPoint(290,588)
point5=QPoint(200,533)
polygon=QPolygon([point1,point2,point3,point4,point5])
qp.drawPolygon(polygon)
#绘制图像
print(os.path.exists('../picture/fairy.jpg')) #此路径是否存在
#装载图像
image = QImage('../picture/fairy.jpg')
#将图像(面积)缩小64倍
rect3=QRect(10,400,image.width()/8,image.height()/8)
#image.save('../picture/new_fairy.jpg')#此法不行,还是得把图片改成.jpg
qp.drawImage(rect3,image)
qp.end()
if __name__=='__main__':
app=QApplication(sys.argv)
main=DrawAll()
main.show()
sys.exit(app.exec_())
运行结果:
问题:
读取图片时,下面这张图片无论如何也不显示
解决办法:
法一:
图片本来是png格式的,png格式不太兼容,我改成jpg格式的就好了。
法二(我在Windows下试了试不行,苹果下应该可以):
用image.save()将图像保存一份,当前目录下就会出现一份新的图片,将路径中的换成新生成的png图片就OK了。
用画刷填充图形区域
代码:
import sys
from PyQt5.QtWidgets import QApplication,QWidget
from PyQt5.QtGui import QPainter, QPolygon, QImage, QBrush
from PyQt5.QtCore import Qt, QRect, QPoint
class FillRect(QWidget):
def __init__(self):
super(FillRect, self).__init__()
self.setWindowTitle('绘制各种图形')
self.resize(400,200)
def paintEvent(self,event):
qp=QPainter(self)
qp.begin(self)
brush=QBrush(Qt.SolidPattern)#实心
qp.setBrush(brush)
qp.drawRect(10,15,90,60)
brush = QBrush(Qt.Dense1Pattern)
qp.setBrush(brush)
qp.drawRect(130, 15, 90, 60)
brush = QBrush(Qt.Dense2Pattern)
qp.setBrush(brush)
qp.drawRect(250, 15, 90, 60)
brush = QBrush(Qt.Dense3Pattern)
qp.setBrush(brush)
qp.drawRect(10, 105, 90, 60)
brush = QBrush(Qt.HorPattern)
qp.setBrush(brush)
qp.drawRect(130, 105, 90, 60)
#剩余的模式自己测试
qp.end()
if __name__=='__main__':
app=QApplication(sys.argv)
main=FillRect()
main.show()
sys.exit(app.exec_())
运行结果: