如何使用 QPainterPath?

3 投票
2 回答
7921 浏览
提问于 2025-04-18 16:49

我正在使用pyqt来创建一个可以显示图片和曲线的应用程序。

为了绘制贝塞尔曲线,我找到了QPainterPath类,特别是QPainterPath.cubicTo这个方法。可是,我不太明白这个类应该怎么用。我应该在什么控件上绘制我的曲线呢?

我看到有QPainterQGraphicsView/QGraphicsScene,但我不知道怎么把我的QPainterPath和它们结合使用。

你有没有关于如何在pyqt/pyside中使用QPainterPath的例子?(比如,一个简单的窗口显示一个三次贝塞尔曲线)

2 个回答

5

你可以在一个自定义的小部件上进行绘图。绘图的工作是在 paintEvent() 方法里面完成的:

import sys
from PyQt4 import QtGui, QtCore

class Example(QtGui.QWidget):

def __init__(self):
    super(Example, self).__init__()

    self.initUI()

def initUI(self):      

    self.setGeometry(300, 300, 280, 170)
    self.setWindowTitle('Draw Bezier')
    self.show()

def paintEvent(self, event):


    startPoint = QtCore.QPointF(0, 0)
    controlPoint1 = QtCore.QPointF(100, 50)
    controlPoint2 = QtCore.QPointF(200, 100)
    endPoint = QtCore.QPointF(300, 300)

    cubicPath = QtGui.QPainterPath(startPoint)
    cubicPath.cubicTo(controlPoint1, controlPoint2, endPoint)


    painter = QtGui.QPainter(self)
    painter.begin(self)
    painter.drawPath(cubicPath);
    painter.end()

这段代码会在 startPointendPoint 之间添加一条三次贝塞尔曲线,使用 controlPoint1controlPoint2 作为控制点。

6

QPainter 是一个比较底层的类。对于简单的应用来说,你可以不去管它。只需要添加一个 QGraphicsView 组件,然后像下面这样做:

# Prepare the QGraphicsView widget
scene = QtGui.QGraphicsScene(graphicsView)
graphicsView.setScene(scene)
graphicsView.setRenderHint(QtGui.QPainter.Antialiasing)

# Draw a line
path = QtGui.QPainterPath()
path.moveTo(0, 0)
path.cubicTo(100, -20, 40, 90, 20, 20)
scene.addPath(path)

撰写回答