第六课 PyQt5绘制图形控件使用

第六课 PyQt5绘制图形控件使用

tags:

  • python
  • 网易云课堂

categories:

  • pyqt5
  • QPainter

第一节 PyQt5绘图API

  1. 文本
  2. 各种图形(直线,点,椭圆,弧,扇形,多边形等)
  3. 图像
# 绘制图像使用到类QPainter
# 实例化类
painter = QPainter()
# 初始化画板
painter.begin()
# 绘制文本、图形、图像(自己去找方法)
painter.drawText(...)
# 结束绘制
painter.end()
# 必须在paintEvent事件方法中绘制各种元素
# 窗口自动改变时paintEvent事件自动触发

第二节 PyQt5绘制文本

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(500, 400)
        self.text = "Python从菜鸟到高手"

    def paintEvent(self, event):
        painter = QPainter(self)
        painter.begin(self)
        # 设置画笔
        print("当窗口尺寸变化时, 自动调用这个方法")
        painter.setPen(QColor(150, 43, 5))
        # 设置字体
        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_())

第三节 PyQt5绘制曲线

  1. 用像素点绘制正弦曲线 -2PI 2PI
  2. 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个周期的正弦曲线')

    def paintEvent(self, event):
        painter = QPainter()
        painter.begin(self)
        # 设置画笔颜色
        painter.setPen(Qt.blue)
        size = self.size()

        for i in range(1000):
            # 横坐标 size.width() / 2.0 显示在屏幕中间
            x = 100 * (-1 + 2.0 * i / 1000) + size.width() / 2.0
            # 纵坐标 size.height() / 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_())

第四节 PyQt5绘制不同类型的直线

import sys, 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('设置Pen的样式')

    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, 8])
        painter.setPen(pen)
        painter.drawLine(20, 240, 250, 240)

        size = self.size()

        painter.end()


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

第五节 PyQt5绘制各种图型

  1. 绘制弧形
  2. 绘制圆形
  3. 绘制多边形
  4. 绘制图像
import sys, math
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)

        qp.setPen(Qt.blue)

        # 绘制弧 0 10 是左上角坐标 100 100是宽度高度
        rect = QRect(0, 10, 100, 100)
        # alen: 1个alen等于1/16度   0是起始角度 50 * 16(50度)停止角度
        qp.drawArc(rect, 0, 50 * 16)
        # 通过弧绘制圆
        qp.setPen(Qt.red)
        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)

        # 椭圆 宽和高不同
        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/book1.png')
        # 图像缩小到原来的三分之一
        rect = QRect(10, 400, image.width() / 3, image.height() / 3)
        # image.save('./images/book1.png')
        qp.drawImage(rect, image)

        qp.end()


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

第六节 PyQt5画笔填充图形区域

import sys, math
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, e):
        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_())
发布了61 篇原创文章 · 获赞 8 · 访问量 2821

猜你喜欢

转载自blog.csdn.net/aa18855953229/article/details/103847983
今日推荐