【Python】PyQt5之QPainter绘图

2022年7月26日 686点热度 0人点赞 0条评论

图片


说明

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_())


图片




  码上加油站

  一起来加油

长按扫码关注

图片




记得点个在看哦!

55610【Python】PyQt5之QPainter绘图

这个人很懒,什么都没留下

文章评论