绘制椭圆

我们可以使用 drawEllipse() 函数绘制椭圆,就像我们在绘制圆时所做的那样。
只需相应地更改点,我们就会得到椭圆。
考虑以下代码:

def paintEvent(self, event):
        painter = QPainter(self)
        painter.setPen(QPen(Qt.green,  5, Qt.SolidLine))
        painter.setBrush(QBrush(Qt.green, Qt.SolidPattern))
        painter.drawEllipse(40, 40, 400, 200)

画一个实心三角形

我们可以使用 setBrush() 方法绘制一个实心三角形,如下所示:

painter.setBrush(QtCore.Qt.blue)

绘制曲线

要绘制曲线,我们应该使用 QPainterPath 模块。

首先,导入模块:

from PyQt5.QtGui import QPainterPath

在paintEvent() 方法中创建一个QPainter 和一个QPainterPath 对象:

painter = QPainter()
path = QPainterPath()

重复激活painter、为painter对象渲染提示以及设置笔和画笔的步骤:

painter.begin(self)
painter.setRenderHint(QPainter.Antialiasing)
painter.setPen(QtCore.Qt.red)
painter.setBrush(QtCore.Qt.red)

使用 QPainterPath 模块的 moveTo() 函数移动到窗口中的 x 和 y 轴:

path.moveTo(40, 40)

使用 QPainterPath 函数的cubicTo(),它会在当前位置和端点(x,y)之间创建一条曲线。

path.cubicTo(40, 40, 150, 250, 250, 40)

最后,使用 drawPath() 方法并传递路径对象来绘制曲线。

画一个矩形

要绘制矩形,我们将使用 QPainter 模块的 drawRect() 方法。

首先,在paintEvent函数中创建QPainter对象:

def paintEvent(self, event):
        painter = QPainter(self)
        painter.setPen(QPen(Qt.black,  5, Qt.SolidLine))
        painter.drawRect(40, 40, 400, 200)

在painter 对象之后,我们使用setPen() 方法设置矩形的颜色和行样式,在我们的示例中为实线。

然后只需使用 drawRect() 方法在窗口上绘制矩形。

我们可以使用其他行样式,例如 DotLine,如下所示:

painter.setPen(QPen(Qt.black,  5, Qt.DotLine))

绘制多边形

要绘制多边形,可以使用 QPolygon 模块的 QPolygon 方法。
首先,我们必须从 QtCore 导入 QPoint,从 QtGui 导入 QPolygon,如下面的代码所示:

from PyQt5.QtGui import QPolygon
from PyQt5.QtCore import QPoint

在下面的代码中,我们声明了一个点数组并将它们传递给 QPolygon() 方法并使用 drawPolygon() 方法绘制多边形。

def paintEvent(self, event):
        painter = QPainter()
        painter.setPen(QPen(Qt.black,  5, Qt.SolidLine))
        painter.setBrush(QBrush(Qt.black, Qt.SolidPattern))
        points = [
            QPoint(10,10),
            QPoint(10,100),
            QPoint(100,10),
            QPoint(100,100)
            ]
        poly = QPolygon(points)
        painter.drawPolygon(poly)

画一条线

在本节中,我们将学习画一条线。
我们可以使用 drawLine() 函数绘制一条线。

drawLine() 函数绘制一条从 a 点到 b 点的线。
请按照以下步骤操作:

  • 创建一个画家对象:
painter = QPainter()
  • 现在使用 begin() 方法激活画家:
painter.begin(self)
  • 现在使用 setRenderHint() 方法,该方法返回指定为画家对象设置的渲染提示的标志。
painter.setRenderHint(QPainter.Antialiasing)
  • 设置行的笔:
painter.setPen(QtCore.Qt.red)
  • 设置画笔:
painter.setBrush(QtCore.Qt.white)
  • 最后,画一条线:
painter.drawLine(0, 0, 200, 200)

绘制一个实心矩形

我们可以使用 setBrush() 函数绘制一个实心矩形,如下所示:

def paintEvent(self, event):
        painter = QPainter(self)
        painter.setPen(QPen(Qt.black,  5, Qt.DotLine))
        painter.setBrush(QBrush(Qt.yellow, Qt.SolidPattern))
        painter.drawRect(40, 40, 400, 200)

画一个三角形

要绘制三角形,可以使用 QPainterPath 模块的 lineTo() 函数。

考虑下面的代码:

def paintEvent(self, event):
        painter = QPainter()
        path = QPainterPath()
        painter.begin(self)
        painter.setRenderHint(QPainter.Antialiasing)
        painter.setPen(QtCore.Qt.blue)
        path.lineTo(160, 400)
        path.lineTo(350, 100)
        path.lineTo(10, 25)
        painter.drawPath(path)

在上面的代码中,我们创建了各个类/模块的对象。
然后激活画家并呈现提示。
然后设置钢笔(钢笔颜色)。

最后,我们在不同的点上使用三个 lineTo() 函数来创建三条线,以便将它们连接在一起:

画一个实心圆

我们可以使用 QBrush 绘制实心圆。
设置图案的颜色和图案样式。

  • 设置画笔,就像我们在上一节中使用 Painter 对象设置笔一样:
painter.setBrush(QBrush(Qt.red, Qt.SolidPattern))

整个painterEvent函数将是这样的:

def paintEvent(self, event):
        painter = QPainter(self)
        painter.setPen(QPen(Qt.green,  8, Qt.SolidLine))
        painter.setBrush(QBrush(Qt.red, Qt.SolidPattern))
        painter.drawEllipse(40, 40, 400, 400)

我们可以使用许多其他模式,例如,交叉模式:

painter.setBrush(QBrush(Qt.red, Qt.CrossPattern))

创建一个 PyQt5 窗口

要创建窗口,请导入以下模块:

from PyQt5 import QtGui
from PyQt5.QtWidgets import QApplication, QMainWindow
import sys

现在创建 Window 类,它为我们的应用程序提供了一个窗口,我们可以其中拥有菜单列、状态列、图形等。

在这个类中,我们将有两个方法;第一个方法是构造函数,在创建类的对象时会自动调用。

第二个方法称为InitWindow,它设置我们在构造函数中定义的参数,例如我们应用程序窗口的标题、长度和宽度等。

class Window(QMainWindow):
    def __init__(self):
        super().__init__()
        self.title = "PyQt5 Drawing Tutorial"
        self.top= 150
        self.left= 150
        self.width = 500
        self.height = 500
        self.InitWindow()
    def InitWindow(self):
        self.setWindowTitle(self.title)
        self.setGeometry(self.top, self.left, self.width, self.height)
        self.show()

在构造函数中,参数被初始化,在 InitWindow() 方法中,使用 setGeometry() 函数将参数应用于窗口。

现在主要步骤: 创建 QApplication 的实例和 Window 类的对象,然后执行窗口。

App = QApplication(sys.argv)
window = Window()
sys.exit(App.exec())

绘制水平线

我们可以使用 drawLine() 方法绘制一条水平线。
考虑以下代码:

def paintEvent(self, event):
        painter = QPainter()
        painter.begin(self)
        painter.setRenderHint(QPainter.Antialiasing)
        painter.setPen(QtCore.Qt.red)
        painter.setBrush(QtCore.Qt.white)
        painter.drawLine(400, 100, 100, 100)

代码与上一节相同,但我们必须在 drawLine() 函数中组织点以获得水平线。
这将生成以下结果:

同样,我们可以通过在 drawLine() 函数中使用以下几点来创建一条垂直线:

painter.drawLine(100, 100, 100, 400)
PyQt5使用Painting API 绘图教程

在本教程中,我们将学习如何在 PyQt5 中绘制矢量图形。

在 Python 中,PyQt5 模块是我们可以用于绘图目的的最简单的模块。

在开始之前,让我们使用 PyQt5 创建一个窗口,我们将其中绘制图形。

画半圆

要创建一个半圆,我们将使用 drawArc() 方法。
请按照以下步骤操作:

  • 创建一个画家对象:
painter = QPainter()
  • 现在使用 begin() 方法激活画家:
painter.begin(self)
  • 现在使用 setRenderHint() 方法,该方法返回指定为画家对象设置的渲染提示的标志。
painter.setRenderHint(QPainter.Antialiasing)
  • 设置圆弧的笔:
painter.setPen(QtCore.Qt.green)
  • 设置画笔:
painter.setBrush(QtCore.Qt.white)
  • 最后,绘制弧线:
painter.drawArc(100, 70, 300, 300, 0 * 16, 180 * 16)

前两个参数分别是 x 和 y 轴。
然后我们有弧的宽度和大小,然后是起始角度。
最后,我们定义了跨度角。

我们可以通过将 180 度更改为 -180 度来创建一个倒置的半圆:

painter.drawArc(100, 70, 300, 300, 0 * 16, -180 * 16)

要创建垂直半圆:

painter.drawArc(100, 70, 300, 300, 90 * 16, 180 * 16)

画圆弧

我们可以使用 drawArc() 方法绘制圆弧。
drawArc() 函数的语法如下:

drawArc(x_axis, y_axis, width, length, startAngle, spanAngle)

在以下示例中,我们将创建一个从 0 度到 90 度的弧:

def paintEvent(self, event):
        painter = QPainter()
        painter.begin(self)
        painter.setRenderHint(QPainter.Antialiasing)
        painter.setPen(QtCore.Qt.red)
        painter.setBrush(QtCore.Qt.white)
        painter.drawArc(100, 70, 300, 300, 0 * 16, 90 * 16)

在图像上绘图

为此,我们从 QtWidgets、QtGui 和 QtCore 模块中导入了所有内容,如下所示:

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

现在paintEvent方法:

  • 创建一个 QPainter 对象。
  • 然后为了导入图像,我们创建了 QPixmap 的对象并将链接传递给图像。我们的图像如下所示:
  • 现在我们必须在窗口上显示图像;我们使用了 drawPixmap()。
  • 设置笔(矩形的行颜色和行样式)。
  • 使用 drawLine() 绘制矩形,它将绘制在图像的顶部。
def paintEvent(self, event):
        painter = QPainter(self)
        pic = QPixmap("Shape_1.png")
        painter.drawPixmap(self.rect(), pic)
        painter.setPen(QPen(Qt.red, 8))
        painter.drawRect(40, 40, 400, 200)

画一个箭头

要绘制箭头,一条是水平线,其余两条线为箭头的头部。
我们可以使用 drawLine() 函数绘制这些线。
考虑下面的代码:

def paintEvent(self, event):
        painter = QPainter()
        painter.begin(self)
        painter.setRenderHint(QPainter.Antialiasing)
        painter.setPen(QtCore.Qt.red)
        painter.setBrush(QtCore.Qt.white)
        painter.drawLine(400, 100, 100, 100)
        painter.drawLine(150, 150, 100, 100)
        painter.drawLine(150, 50, 100, 100)

第一个 drawLine() 函数用于绘制水平线,第二个函数创建箭头的下部,第三个函数创建箭头的上部。

画一个圆圈

要绘制图形,请导入以下模块:

from PyQt5.QtGui import QPainter, QBrush, QPen
from PyQt5.QtCore import Qt

QPainter 提供了各种功能来绘制基本形状。
例如,行、矩形等。
QBrush 模块为形状提供颜色、纹理等。
QPen 定义了 QPainter 的工作方式,即 QPainter 应该如何设计或者设计形状。

  • 第一步是定义完成所有绘画工作的方法;该方法是paintEvent():
def paintEvent(self, event):
  • 创建一个画家对象:
painter = QPainter(self)
  • 现在为画家设置 QPen 并将颜色和样式分配给圆圈的行:
painter.setPen(QPen(Qt.green,  8, Qt.DashLine))

值 8 是圆线的宽度。

  • 使用 drawEllipse(x_axis, y_axis, width, height) 绘制圆。我们使用我们在步骤 2 中创建的画家对象调用 drawEllipse() 方法。定义 x 和 y 轴,圆将在窗口中放置的位置以及大小(高度和宽度)。
painter.drawEllipse(40, 40, 400, 400)

在这个例子中,我们使用了 DashLine 作为行样式;我们还可以使用 SolidLine 创建一个实线连续圆,如下所示:

painter.setPen(QPen(Qt.green,  8, Qt.SolidLine))

绘制渐变

我们将使用 LinearGradient,为此,我们将导入 QLinearGradient 模块。

from PyQt5.QtGui import QLinearGradient
    def paintEvent(self, event):
        painter = QPainter()
        painter.setPen(QPen(Qt.black,  5, Qt.SolidLine))
       grad = QLinearGradient(80, 40, 30, 10)
        painter.setBrush(QBrush(grad))
        painter.drawRect(10, 10, 200, 200)

我们已经创建了一个渐变对象并将值传递给 QLinearGradient 模块。
接下来,我们将颜色值传递给 QLinearGradient 模块,最后,我们使用渐变对象设置画笔。

日期:2020-07-15 11:16:24 来源:oir作者:oir