PyQt5—基本窗口控件之窗口绘图类控件

窗口绘图类控件

  • 基本窗口控件
    • 十一、窗口绘图类控件
      • 1、QPainter
      • 2、QPen
      • 3、QBrush
      • 4、QPixmap

基本窗口控件

十一、窗口绘图类控件

  • PyQt5 中,通常用 QPainter、QPen 和 QBrush 这三个类在窗口中实现绘图功能。同时,QPixmap 也可以视为绘图的一个类,因为可以加载并呈现本地图像。

1、QPainter

  • QPainter 类在 QWidget(控件)上执行绘图操作,该类是一个绘制工具,为大部分图形界面提供了高度优化的函数。
  • QPainter 可以绘制从简单的直线到复杂的饼图等。
  • 绘制操作在 QWidget.paintEvent() 中完成;绘制方法必须放在 QtGui.QPainter 对象的 begin() 和 end() 之间。
  • QPainter 类的常用方法如下:
    方法 描述
    begin() 开始在目标设备上绘制
    drawArc() 在起始角度和最终角度之间画弧
    drawEliipse() 在一个矩形内画一个椭圆
    drawLine(int x1,int y1,int x2,int y2) 绘制一条指定了端点坐标的直线,并且指定当前画笔位置为(x2,y2)
    drawPixmap() 从图像文件中提取 Pixmap 并将其显示在指定位置
    drawPolygon() 使用坐标数组绘制多边形
    drawRect(int x,int y,int w,int h) 以给定的宽度和高度从左上角坐标(x,y)开始绘制一个矩形
    drawText() 显示给定坐标处的文字
    fillRext() 使用 QColor 参数填充矩形
    setBrush() 设置画笔风格
    setPen() 设置用于绘制的笔的颜色、大小和样式
  • setPen() 方法的可选参数如下表:
    描述
    Qt.NoPen 没有线
    Qt.SolidLine 一条简单的线
    Qt.DashLine 由一些像素分隔的短线
    Qt.DotLine 由一些像素分隔得点
    Qt.DashDotLine 轮流交替的点和短线
    Qt.DashDotDotLine 一条短线、两个点
    Qt.MPenStyle 画笔风格的掩码
  • 绘制文字的示例
    # -*- coding:utf-8 -*-
    # Time : 2019/08/17 下午 3:50 
    # Author : 御承扬
    # e-mail:[email protected]
    # project:  PyQt5
    # File : qt25_drawText.py 
    # @software: PyCharm
    
    
    import sys
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    from PyQt5.QtCore import *
    
    
    class Drawing(QWidget):
        def __init__(self, parent=None):
            super(Drawing, self).__init__(parent)
            self.setWindowTitle("在窗口中绘制文字")
            self.setWindowIcon(QIcon("./images/Python2.ico"))
            self.resize(300, 200)
            self.text = "欢迎学习 PyQt5"
    
        def paintEvent(self, event):
            painter = QPainter()
            painter.begin(self)
            # 自定义绘制方法
            self.draw_text(event, painter)
            painter.end()
    
        def draw_text(self, event, qp):
            # 设置画笔颜色
            qp.setPen(QColor(168, 34, 3))
            # 设置字体
            qp.setFont(QFont('SimSun', 20))
            # 绘制文字
            qp.drawText(event.rect(), Qt.AlignCenter, self.text)
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        demo = Drawing()
        demo.show()
        sys.exit(app.exec_())
    
  • 运行效果如下:
    PyQt5—基本窗口控件之窗口绘图类控件_第1张图片
  • 绘制点示例
    # -*- coding:utf-8 -*-
    # Time : 2019/08/17 下午 4:56 
    # Author : 御承扬
    # e-mail:[email protected]
    # project:  PyQt5
    # File : qt26_drawPoint.py 
    # @software: PyCharm
    
    
    import sys, math
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    from PyQt5.QtCore import Qt
    
    
    class Drawing(QWidget):
        def __init__(self, parent=None):
            super(Drawing, self).__init__(parent)
            self.resize(300, 200)
            self.setWindowTitle("在窗口中画点")
            self.setWindowIcon(QIcon("./images/Python2.ico"))
    
        def paintEvent(self, event):
            # 初始化绘图工具
            qp = QPainter()
            qp.begin(self)
            # 自定义画点方法
            self.drawPoints(qp)
            qp.end()
    
        def drawPoints(self, qp):
            qp.setPen(Qt.red)
            size = self.size()
    
            for i in range(1000):
                # 绘制正弦图形,周期 [-1000,1000]
                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
                qp.drawPoint(x, y)
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        win = Drawing()
        win.show()
        sys.exit(app.exec_())
    
  • 运行效果如下:
    PyQt5—基本窗口控件之窗口绘图类控件_第2张图片

2、QPen

  • QPen(钢笔)是基本图形对象,用于绘制直线、曲线或者给轮廓画出矩形、椭圆形、多边形以及其他形状等。
  • QPen 示例:
    # -*- coding:utf-8 -*-
    # Time : 2019/08/17 下午 5:25 
    # Author : 御承扬
    # e-mail:[email protected]
    # project:  PyQt5
    # File : qt27_drawPen.py 
    # @software: PyCharm
    
    
    import sys
    from PyQt5.QtWidgets import *
    from PyQt5.QtGui import *
    from PyQt5.QtCore import *
    
    
    class Drawing(QWidget):
        def __init__(self):
            super().__init__()
            self.initUI()
    
        def initUI(self):
            self.setGeometry(300, 300, 280, 270)
            self.setWindowTitle("钢笔样式例子")
            self.setWindowIcon(QIcon("./images/Python2.ico"))
    
        def paintEvent(self, e):
            qp = QPainter()
            qp.begin(self)
            self.drawLine(qp)
            qp.end()
    
        def drawLine(self, qp):
            pen = QPen(Qt.black, 2, Qt.SolidLine)
            qp.setPen(pen)
            qp.drawLine(20, 40, 250, 40)
    
            pen.setStyle(Qt.DashLine)
            qp.setPen(pen)
            qp.drawLine(20, 80, 250, 80)
    
            pen.setStyle(Qt.DashDotLine)
            qp.setPen(pen)
            qp.drawLine(20, 120, 250, 120)
    
            pen.setStyle(Qt.DotLine)
            qp.setPen(pen)
            qp.drawLine(20, 160, 250, 160)
    
            pen.setStyle(Qt.DashDotDotLine)
            qp.setPen(pen)
            qp.drawLine(20, 200, 250, 200)
    
            pen.setStyle(Qt.CustomDashLine)
            pen.setDashPattern([1, 4, 5, 4])
            qp.setPen(pen)
            qp.drawLine(20, 240, 250, 240)
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        demo = Drawing()
        demo.show()
        sys.exit(app.exec_())
    
  • 运行效果:
    PyQt5—基本窗口控件之窗口绘图类控件_第3张图片

3、QBrush

  • QBrush(画刷),用于填充如矩形、椭圆形或多边形等形状。
  • QBrush 有三种类型:预定义、过渡和纹理图案。
  • QBrush 示例:
    # -*- coding:utf-8 -*-
    # Time : 2019/08/17 下午 6:28 
    # Author : 御承扬
    # e-mail:[email protected]
    # project:  PyQt5
    # File : qt28_drawBrush.py 
    # @software: PyCharm
    
    
    import sys
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    
    
    class Drawing(QWidget):
        def __init__(self):
            super().__init__()
            self.initUI()
    
        def initUI(self):
            self.setGeometry(300, 300, 365, 280)
            self.setWindowTitle("画刷示例")
            self.setWindowIcon(QIcon("./images/Python2.ico"))
            self.show()
    
        def paintEvent(self, e):
            qp = QPainter()
            qp.begin(self)
            self.drawLines(qp)
            qp.end()
    
        def drawLines(self, qp):
            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.DiagCrossPattern)
            qp.setBrush(brush)
            qp.drawRect(10, 105, 90, 60)
    
            brush = QBrush(Qt.Dense5Pattern)
            qp.setBrush(brush)
            qp.drawRect(130, 105, 90, 60)
    
            brush = QBrush(Qt.Dense6Pattern)
            qp.setBrush(brush)
            qp.drawRect(250, 105, 90, 60)
    
            brush = QBrush(Qt.HorPattern)
            qp.setBrush(brush)
            qp.drawRect(10, 195, 90, 60)
    
            brush = QBrush(Qt.VerPattern)
            qp.setBrush(brush)
            qp.drawRect(130, 195, 90, 60)
    
            brush = QBrush(Qt.BDiagPattern)
            qp.setBrush(brush)
            qp.drawRect(250, 195, 90, 60)
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        demo = Drawing()
        demo.show()
        sys.exit(app.exec_())
    
  • 运行效果如下:
    PyQt5—基本窗口控件之窗口绘图类控件_第4张图片

4、QPixmap

  • QPixmap 类用于绘图设备的图像显示,可作为一个 QPaintDevice 对象,也可以加载到一个控件中。
  • QPixmap 可以读取的图像文件类型有:BMP、GIF、JPG、JPEG、PNG、PBM、PGM、PPM、XBM、XPM 等。
  • QPixmap 类的常用方法如下:
    方法 描述
    copy() 从 QRect 对象复制到 QPixmap 对象
    fromIamge() 将 QImage 对象转换为 QPixmap 对象
    grabWidget() 从给定的窗口小控件创建一个像素图
    grabWindow() 在窗口中创建数据的像素图
    load() 加载图像文件作为 QPixmap 对象
    save() 将 QPixmap 对象保存为文件
    toImage() 将 QPixmap 对象转换为 QImage 对象
  • QPixmap 示例
    # -*- coding:utf-8 -*-
    # Time : 2019/08/18 上午 8:37 
    # Author : 御承扬
    # e-mail:[email protected]
    # project:  PyQt5
    # File : qt29_Pixmap.py 
    # @software: PyCharm
    
    
    import sys
    from PyQt5.QtCore import *
    from PyQt5.QtGui import *
    from PyQt5.QtWidgets import *
    
    
    if __name__ == "__main__":
        app = QApplication(sys.argv)
        win = QWidget()
        lab = QLabel()
        lab.setPixmap(QPixmap("./images/python.jpg"))
        vBox = QVBoxLayout()
        vBox.addWidget(lab)
        win.setLayout(vBox)
        win.setWindowTitle("QPixmap 例子")
        win.setWindowIcon(QIcon("./images/Python2.ico"))
        win.show()
        sys.exit(app.exec_())
    
  • 运行效果如下:
    PyQt5—基本窗口控件之窗口绘图类控件_第5张图片

你可能感兴趣的:(PyQt5)