五、PyQt5 之 绘图

一、绘制文本

#!/usr/bin/python
# -*- coding:utf-8 -*-

"""
绘图API:绘制文本

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 = "Python常规操作"

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.begin(self)
        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_())

二、用像素点绘制正弦曲线

#!/usr/bin/python
# -*- coding:utf-8 -*-
"""
用像素点回执正弦曲线

-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(300, 300)
        self.setWindowTitle("在窗口上用像素点绘制2个周期的正弦曲线")

    # 重写paintEvent 方法, 该函数会自动调用
    def paintEvent(self, event):
        painter = QPainter()
        # 画图开始
        painter.begin(self)
        # 设置笔的颜色
        painter.setPen(Qt.blue)
        # 获取窗口的尺寸
        size = self.size()
        # 像素为1000
        for i in range(1000):
            # 说是曲线,其实是画了1000个点,看上去有点像曲线
            # 因为在 0-999中间取值, -1 + 2.0 * i / 1000 范围就是 -1 --- 1 的范围
            # size.width() / 2.0 是将绘制原点挪到窗口宽度的中间
            x = 100 * (-1 + 2.0 * i / 1000) + size.width() / 2.0
            y = -50 * math.sin((x - size.width() / 2.0) * math.pi / 50) + size.height() / 2.0
            # 绘制像素点
            painter.drawPoint(x, y)
        # 画图结束
        painter.end()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = DrawPoints()
    main.show()
    sys.exit(app.exec_())

三、绘制各种不同类型的直线

#!/usr/bin/python
# -*- coding:utf-8 -*-

import sys
import math
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import Qt


class DrawMultiLine(QWidget):
    def __init__(self):
        super(DrawMultiLine, self).__init__()
        self.resize(300, 300)
        self.setWindowTitle("绘制不同类型的直线")

    # 重写paintEvent 方法, 该函数会自动调用
    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)
        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.DashDotDotLine)
        painter.setPen(pen)
        painter.drawLine(20, 200, 250, 200)

        # 设置自定义
        pen.setStyle(Qt.CustomDashLine)
        pen.setDashPattern([1, 10, 5, 4]) # 设置每两个之间的间距
        painter.setPen(pen)
        painter.drawLine(20, 240, 250, 240)

        # 画图结束
        painter.end()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = DrawMultiLine()
    main.show()
    sys.exit(app.exec_())

四、绘制各种图形

#!/usr/bin/python
# -*- coding:utf-8 -*-


"""
可以绘制弧形,圆形,矩形,多边形,绘制图像
"""

import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *


class DrawAll(QWidget):
    def __init__(self):
        super(DrawAll, self).__init__()
        self.resize(300, 600)
        self.setWindowTitle("绘制各种图形")

    def paintEvent(self, event):
        qp = QPainter()
        qp.begin(self)

        # 绘制弧形, 弧形在一个矩形范围内, 0,10 代表左上角坐标, 100,100: 宽度, 高度
        rect = QRect(0, 10, 100, 100)
        qp.setPen(Qt.blue)
        # 绘制区域,起始角度, 结束角度, 单位是 alen = 1/16度
        qp.drawArc(rect, 0, 45 * 16)  # 绘制从 0 - 45 度

        # 绘制圆形
        qp.setPen(Qt.red)
        # 起始x位置, 起始y位置,宽度, 高度, 起始度数, 结束度数
        qp.drawArc(120, 10, 100, 100, 0, 360 * 16)

        # 绘制带弦的弧
        qp.drawChord(10, 120, 100, 100, 12, 130 * 16)

        # 绘制扇形
        qp.drawPie(10, 240, 100, 100, 12, 130 * 16)

        # 绘制椭圆 起始想,起始y, 宽度, 高度。 要是宽度 = 高度 就是圆
        qp.drawEllipse(120, 120, 150, 100)

        # 绘制五边形, 需要 5 个点
        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)

        # 绘制图像
        image = QImage("../images/python.png")
        # 绘制图像区域,是原图像的1/3
        rect = QRect(10, 400, image.width()/3, image.height()/3)
        qp.drawImage(rect, image)

        qp.end()


if __name__ == '__main__':
    app = QApplication(sys.argv)
    main = DrawAll()
    main.show()
    sys.exit(app.exec_())

五、用画刷填充图形区域

#!/usr/bin/python
# -*- coding:utf-8 -*-


import sys
from PyQt5.QtWidgets import *
from PyQt5.QtGui import *
from PyQt5.QtCore import *


class FillRect(QWidget):
    def __init__(self):
        super(FillRect, self).__init__()
        self.resize(600, 600)
        self.setWindowTitle("用画刷填充区域")

    def paintEvent(self, event):
        qp = QPainter()
        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_())

 

posted on 2022-06-30 08:20  软饭攻城狮  阅读(374)  评论(0编辑  收藏  举报

导航