说明
QPainter 类在 QWidget(控件)上执行绘图操作,它是一个绘制工具,为大部分图形界面提供了高度优化的函数,使用 QPainter 类可以绘制从简单的直线到复杂的饼图等。它也可以画文本和图像。QPainter 可以在任何继承自 QPaintDevice 的对象上进行绘制。
QpaintDevice 子类有 QPixmap、QBitmap、QImage、 QPicture、QOpenGLPaintDevice、QWidget 等。
QPainter 的核心功能是绘图,但该类还提供了几个功能,允许您自定义 QPainter 的设置及其渲染质量,以及其他启用剪切的功能。
此外,您可以通过指定 painter 的合成模式来控制不同形状的合并方式。
绘制操作在 QWidget.paintEvent() 中完成。绘制方法必须放在 QtGui.QPainter 对象的 painter 的 begin() 和 end() 之间。isActive() 函数指示 painter 是否处于激活状态。painter 由 begin() 函数和带有 QPaintDevice 参数的构造函数激活;由 end() 函数和析构函数将其停用。
常用方法:
Open类
Open类主要是设置画笔,常用的方法有:
-
setColor()设置颜色
-
setWidth()设置画笔宽度
-
setDshPattern()使用数字列表自定义画笔样式
-
setStyle()画笔样式,这是一个枚举类,可以由 QPainter 类绘制。
画笔风格如下:
Qbrush类
Qbrush类主要是设置笔刷,用来填充几何图形
-
setColor() 设置笔刷颜色
-
setTexture()将笔刷的pixmap设置为QPixmap,样式需要设置为Qt.TexturePattern
-
setStyle() 设置笔刷样式
-
Qt.SolidPattern
-
Qt.Dense1Pattern
-
Qt.Dense2Pattern
-
Qt.Dense3Pattern
-
Qt.Dense4Pattern
-
Qt.Dense5Pattern
-
Qt.Dense6Pattern
-
Qt.Dense7Pattern
-
Qt.HorPattern
-
Qt.VerPattern
-
Qt.CrossPattern
-
Qt.DiagCrossPattern
-
Qt.BDiagPatter
-
Qt.FDiagPatter
-
Qt.LinearGradientPattern
-
Qt.ConicalGradientPattern
-
Qt.RadialGradientPattern
-
Qt.TexturePattern
QFont类
QFont类封装了字体的大小和样式属性
常用方法:
-
setFamily():设置字体
-
setPointSize():以像素为单位设置字体文字的大小
-
setBold():设置字体是否为粗体
-
setItalic():设置是否为斜体
-
setPointSize():设置文字大小
-
setUnderline():设置下划线
-
setCapicalization():设置字母显示样式,QFont.Capitalize首字母大写,QFont.AllUpercase全部大写,QFont.Allcase全部小写
-
setWeight():设置文字粗细,如QFont.Bold加粗,QFont.Light正常
-
setLetterSpacing():设置文件间距,如QFont.PercentageSpacing按百分比设置文件间距,默认为100,QFont.AboluteSpacing按像素设置文件间距,默认为100,
-
setStrikeOut():设置是否有中划线
-
setOverline():设置是否有上划线
-
setStyle():设置样式,常用取值QFont.StyleItalic斜体样式和QFont.StyleNormal正常样式
QPixmap类
QPixmap类主要是可以将图形显示在标签或按钮的控件上,支持很多的图像类型,比如常用的BMP,JPG,PNG,GIF,JPEG,ICO等,使用QPixmap获取图像时,可以直接在其构造函数中指定图片,用法为“QPixmap(图片路径)”。
常用的方法
-
load():加载指定图像文件作为QPixmap对象
-
fromImage():将QImage对象转换为QPixmap对象
-
toImage():将QPixmap对象转换为QImage对象
-
copy():从QRect对象复制到QPixmap对象
-
save():将QPixmap对象保存为文件
示例一:图形基本绘制
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPainter
from PyQt5.QtCore import Qt
class Demo(QWidget):
def __init__(self,parent=None):
super(Demo,self).__init__(parent)
self.setWindowTitle("使用QPainter绘制图形") # 设置窗口标题
self.resize(300,120) # 设置窗口大小
def paintEvent(self,event):
painter=QPainter(self) # 创建绘图对象
painter.setPen(Qt.red) # 设置画笔
painter.drawEllipse(80, 10, 50, 30) # 绘制一个椭圆
painter.drawRect(180, 10, 50, 30) # 绘制一个矩形
painter.drawLine(80, 70, 200, 70) # 绘制直线
painter.drawText(90,100,"人生苦短,我用Python") # 绘制文本
if __name__=='__main__':
import sys
app=QApplication(sys.argv) # 创建窗口程序
demo=Demo() # 创建窗口类对象
demo.show() # 显示窗口
sys.exit(app.exec_())
示例二:笔刷的设置
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPainter,QPen,QColor
from PyQt5.QtCore import Qt
class Demo(QWidget):
def __init__(self,parent=None):
super(Demo,self).__init__(parent)
self.setWindowTitle("画笔的设置") # 设置窗口标题
self.resize(300,120) # 设置窗口大小
def paintEvent(self,event):
painter=QPainter(self) # 创建绘图对象
pen=QPen() # 创建画笔对象
# 设置第1条直线的画笔
pen.setColor(Qt.red) # 设置画笔颜色为红色
pen.setStyle(Qt.SolidLine) # 设置画笔样式为正常直线
pen.setWidth(1) # 设置画笔宽度
painter.setPen(pen) # 设置画笔
painter.drawLine(80, 10, 200, 10) # 绘制直线
# 设置第2条直线的画笔
pen.setColor(Qt.blue) # 设置画笔颜色为蓝色
pen.setStyle(Qt.DashLine) # 设置画笔样式为由一些像素分割的短线
pen.setWidth(2) # 设置画笔宽度
painter.setPen(pen) # 设置画笔
painter.drawLine(80, 30, 200, 30) # 绘制直线
# 设置第3条直线的画笔
pen.setColor(Qt.cyan) # 设置画笔颜色为青色
pen.setStyle(Qt.DotLine) # 设置画笔样式为由一些像素分割的点
pen.setWidth(3) # 设置画笔宽度
painter.setPen(pen) # 设置画笔
painter.drawLine(80, 50, 200, 50) # 绘制直线
# 设置第4条直线的画笔
pen.setColor(Qt.green) # 设置画笔颜色为绿色
pen.setStyle(Qt.DashDotLine) # 设置画笔样式为交替出现的短线和点
pen.setWidth(4) # 设置画笔宽度
painter.setPen(pen) # 设置画笔
painter.drawLine(80, 70, 200, 70) # 绘制直线
# 设置第5条直线的画笔
pen.setColor(Qt.black) # 设置画笔颜色为黑色
pen.setStyle(Qt.DashDotDotLine) # 设置画笔样式为交替出现的短线和两个点
pen.setWidth(5) # 设置画笔宽度
painter.setPen(pen) # 设置画笔
painter.drawLine(80, 90, 200, 90) # 绘制直线
# 设置第6条直线的画笔
pen.setColor(QColor(48,235,100)) # 自定义画笔颜色
pen.setStyle(Qt.CustomDashLine) # 设置画笔样式为自定义样式
pen.setDashPattern([1,3,2,3]) # 设置自定义的画笔样式
pen.setWidth(6) # 设置画笔宽度
painter.setPen(pen) # 设置画笔
painter.drawLine(80, 110, 200, 110) # 绘制直线
if __name__=='__main__':
import sys
app=QApplication(sys.argv) # 创建窗口程序
demo=Demo() # 创建窗口类对象
demo.show() # 显示窗口
sys.exit(app.exec_())
示例三:字体的设置
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPainter,QFont
from PyQt5.QtCore import Qt
import random
class Demo(QWidget):
def __init__(self,parent=None):
super(Demo,self).__init__(parent)
self.setWindowTitle("绘制验证码") # 设置窗口标题
self.resize(150,60) # 设置窗口大小
# 定义存储数字、字母的列表,用来从中生成验证码
char = []
for i in range(48, 58): # 添加0——9的数字
char.append(chr(i))
for i in range(65, 91): # 添加A——Z的大写字母
char.append(chr(i))
for i in range(97, 123): # 添加a——z的小写字母
char.append(chr(i))
# 生成随机数字或字母
def rndChar(self):
return self.char[random.randint(0, len((self.char)))]
def paintEvent(self,event):
painter=QPainter(self) # 创建绘图对象
painter.drawRect(10,10, 100, 30)
# 绘制干扰线(此处设置20条干扰线,可以随意设置)
painter.setPen(Qt.red)
for i in range(20):
painter.drawLine(
random.randint(10, 110), random.randint(10, 40),
random.randint(10, 110), random.randint(10, 40)
)
painter.setPen(Qt.green)
# 绘制噪点(此处设置500个噪点,可以随意设置)
for i in range(500):
painter.drawPoint(random.randint(10, 110), random.randint(10, 40))
painter.setPen(Qt.black) # 设置画笔
font=QFont() # 创建字体对象
font.setFamily("楷体") # 设置字体
font.setPointSize(15) # 设置文字大小
font.setBold(True) # 设置粗体
font.setUnderline(True) # 设置下划线
painter.setFont(font)
for i in range(4):
painter.drawText(30 * i + 10, 30,str(self.rndChar())) # 绘制文本
if __name__=='__main__':
import sys
app=QApplication(sys.argv) # 创建窗口程序
demo=Demo() # 创建窗口类对象
demo.show() # 显示窗口
sys.exit(app.exec_())
示例:绘制图片
from PyQt5.QtWidgets import *
from PyQt5.QtGui import QPainter,QPixmap
class Demo(QWidget):
def __init__(self,parent=None):
super(Demo,self).__init__(parent)
self.setWindowTitle("绘制Logo图片") # 设置窗口标题
self.resize(300,120) # 设置窗口大小
def paintEvent(self,event):
painter=QPainter(self) # 创建绘图对象
# painter.drawPixmap(10, 10, QPixmap("./resource/logo.png")) # 默认大小
painter.drawPixmap(10, 10, 290, 110, QPixmap("./resource/logo.png")) # 指定大小
if __name__=='__main__':
import sys
app=QApplication(sys.argv) # 创建窗口程序
demo=Demo() # 创建窗口类对象
demo.show() # 显示窗口
sys.exit(app.exec_())
完
码上加油站
一起来加油
长按扫码关注
文章评论