QPainter和QPainterPath理解

QPainterPath

(一)简介

QPainterPath 类(绘图路径)提供了一个容器,用于绘图操作,可以创建和重用图形形状。
绘图路径是由许多图形化的构建块组成的对象,例如:矩形、椭圆、直线和曲线。构建块可以加入在封闭的子路径中,例如:矩形或椭圆。封闭的路径的起点和终点是一致的,或者他们可以作为未封闭的子路径独立存在,如:直线和曲线。
QPainterPath 可以被填充、描绘轮廓、裁剪。要为一个指定的绘图路径生成可填充的轮廓,可以使用 QPainterPathStroker 类。与正常绘图相比,QPainterPath 的主要优点在于:复杂的图形只需创建一次,然后只需调用 QPainter::drawPath() 函数即可绘制多次。
QPainterPath 提供了一组函数,可用于获取绘图路径及其元素的信息。除了可以使用 toReversed() 函数来改变元素的顺序外,还有几个函数将 QPainterPath 对象转换成一个多边形表示。

(二)常用函数

1.addEllipse()

void addEllipse(const QRectF &boundingRectangle)

QLinearGradient myGradient;
QPen myPen;
QRectF boundingRectangle;
QPainterPath myPath;
myPath.addEllipse(boundingRectangle);
QPainter painter(this);
painter.setBrush(myGradient);
painter.setPen(myPen);
painter.drawPath(myPath);

void addEllipse(qreal x, qreal y, qreal width, qreal height)
在其左上角(x, y)、宽度和高度定义的边界矩形内创建一个椭圆,并将其作为一个封闭的子路径添加到绘图器路径中。

2.addPath()

void addPath(const QPainterPath &path)
加入另一个QPainterPath对象中保存的内容

3.addPolygon()

void addPolygon(const QPolygonF &polygon)
添加一个多边形

QLinearGradient myGradient;
QPen myPen;
QPolygonF myPolygon;
QPainterPath myPath;
myPath.addPolygon(myPolygon);
QPainter painter(this);
painter.setBrush(myGradient);
painter.setPen(myPen);
painter.drawPath(myPath);

4.addRect()

void addRect(const QRectF &rectangle)

QLinearGradient myGradient;
QPen myPen;
QRectF myRectangle;
QPainterPath myPath;
myPath.addRect(myRectangle);
QPainter painter(this);
painter.setBrush(myGradient);
painter.setPen(myPen);
painter.drawPath(myPath);

void addRect(qreal x, qreal y, qreal width, qreal height)
在其左上角(x, y)、宽度和高度定义的边界矩形内创建一个矩形,并将其作为一个封闭的子路径添加到绘图器路径中。

5.addRoundedRect()

void addRoundedRect(const QRectF &rect, qreal xRadius, qreal yRadius, Qt::SizeMode mode = Qt::AbsoluteSize)

QRectF rect(150,150,200,150);//(x,y,w,h)
QPainterPath path;
path.addRoundedRect(rect,10,10);

void addRoundedRect(qreal x, qreal y, qreal w, qreal h, qreal xRadius,qreal yRadius, Qt::SizeMode mode = Qt::AbsoluteSize)
将带有圆角的给定矩形x, y, w, h添加到路径中。 xRadius,yRadiusj角度

QPainterPath path;
path.addRoundedRect(150,150,200,150,10,10);

6.addText()

添加一个字符串
void addText(const QPointF &point, const QFont &font, const QString &text)

QPoint point(50,50);
QFont f("ZYSong 18030",12);
QPainterPath path;
path.addText(point,f,"Hello");

void addText(qreal x, qreal y, const QFont &font, const QString &text)

QFont f("ZYSong 18030",12);
QPainterPath path;
path.addText(50,50,f,"Hello");

7.cubicTo()

三次贝塞尔曲线
void cubicTo(const QPointF &c1, const QPointF &c2, const QPointF &endPoint)
c1,c2,为控制点;endPoint为终点点
void cubicTo(qreal c1X, qreal c1Y, qreal c2X, qreal c2Y, qreal endPointX, qreal endPointY)
(c1x,c1y),(c2x,c2y)为控制点,(endPointx,endPointY)为终点

    QPainterPath path;
    path.moveTo(100,100);
    path.cubicTo(300,100,200,200,300,300);
    path.cubicTo(100,300,200,200,100,100);
    QPainter painter(this);
    painter.setBrush(myGradient);
    painter.setPen(myPen);
    painter.drawPath(path);

8.lineTo()

绘制直线
void QPainterPath::lineTo(qreal x, qreal y)
从当前点画一条直线到(x,y)点

9.arcTo()

画弧
void arcTo(const QRectF &rectangle, qreal startAngle, qreal sweepLength)

void arcTo(qreal x, qreal y, qreal width, qreal height, qreal startAngle, qreal sweepLength)

创建一个占据给定矩形的圆弧,从指定的起始角开始,逆时针方向延伸甜度。角度用度数表示。顺时针的弧可以用负角来指定。
注意:这个函数将弧的起始点连接到当前位置(如果它们还没有连接)。添加弧后,当前位置为弧中的最后一点。要画一条回到第一点的线,可以使用closeSubpath()函数。
0.0f表示0°,120.0f表示120°

例子

10.setFillRule()

设置填充规则
Qt::OddEvenFill奇偶填充规则;Qt::WindingFill非零绕组填充(封闭填充)

11.moveTo()

void moveTo(const QPointF &point)
void moveTo(qreal x, qreal y)
把起始点移动到(x,y)

12.closeSubpath()

void closeSubpath()
通过在子路径的开始处画一条线来关闭当前子路径,并自动启动一个新路径。新路径的当前点为(0,0)。如果子路径不包含任何元素,则此函数不执行任何操作。

QPainter

(一)简介

QPainter类在小部件和其他绘制设备上执行低级绘制。QPainter提供了高度优化的功能来完成GUI程序所需的大部分绘图。它可以画任何东西,从简单的线条到复杂的形状,如馅饼和和弦。它还可以绘制对齐文本和像素图。通常,它在一个“自然”的坐标系中绘制,但是它也可以进行视图和世界的转换。QPainter可以对继承QPaintDevice类的任何对象进行操作。QPainter的常见用法是在小部件的绘制事件中:构造并自定义(例如设置画笔或画笔)painter。然后画。记得在绘制完QPainter对象后销毁它。例如:

void SimpleExampleWidget::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setPen(Qt::blue);
    painter.setFont(QFont("Arial", 30));
    painter.drawText(rect(), Qt::AlignCenter, "Qt");
}

QPainter的核心功能是绘图,但是这个类也提供了几个函数,允许您定制QPainter的设置和它的渲染质量,以及其他启用剪切的函数。此外,您可以通过指定画家的合成模式来控制不同的形状如何合并在一起。函数的作用是:指示画家是否处于活动状态。画家是由begin()函数和接受QPaintDevice参数的构造函数激活的。end()函数和析构函数使其失效。与QPaintDevice和QPaintEngine类一起,QPainter构成了Qt绘制系统的基础。QPainter是用于执行绘图操作的类。QPaintDevice表示一个可以使用QPainter绘制的设备。QPaintEngine提供了画家在不同类型的设备上绘制的界面。如果漆器处于活动状态,device()返回漆器在其上绘制的绘制设备,而paintEngine()返回漆器当前运行的绘制引擎。有关更多信息,请参见绘制系统。有时,让别人在一个不寻常的QPaintDevice上作画是可取的。QPainter支持一个静态函数setre定向()来完成这个任务。
警告:当paintdevice(绘图设备)是一个小部件时,QPainter只能在paintEvent()函数或paintEvent()调用的函数中使用

(二)常用函数

1.drawArc()

画弧
void drawArc(const QRectF &rectangle, int startAngle, int spanAngle)

void drawArc(const QRect &rectangle, int startAngle, int spanAngle)

void drawArc(int x, int y, int width, int height, int startAngle, int spanAngle)

startAngle是起始角(弧形的起始点与圆心的连线与水平线的夹角)、spanAngle是跨度角

注意:QPainter中的弧度值是以1/16°为单位,在画弧是1°用16表示

    QPainter p(this);
    p.setPen(pen);
    p.setBrush(brush);
    QRect rect(50,100,300,200);
    int startAngle=30*16;
    int spanAngle=120*16;
    p.drawArc(rect,startAngle,spanAngle);

2.drawChord()

画弦
void drawChord(const QRectF &rectangle, int startAngle, int spanAngle)

void drawChord(int x, int y, int width, int height, int startAngle, int spanAngle)

void drawChord(const QRect &rectangle, int startAngle, int spanAngle)

    QPainter p(this);
    p.setPen(pen);
    p.setBrush(brush);
    QRect rect(50,100,300,200);
    int startAngle=30*16;
    int spanAngle=120*16;
    p.drawChord(rect,startAngle,spanAngle);

3.drawRect()

画矩形

4.drawLine()

画直线
void drawLine(const QLineF &line)
void drawLine(const QLine &line)
void drawLine(int x1, int y1, int x2, int y2)
void drawLine(const QPoint &p1, const QPoint &p2)
void drawLine(const QPointF &p1, const QPointF &p2)
void drawLines(const QLineF *lines, int lineCount)
void drawLines(const QVector<QLineF> &lines)
void drawLines(const QPointF *pointPairs, int lineCount)
void drawLines(const QVector<QPointF> &pointPairs)
void drawLines(const QLine *lines, int lineCount)
void drawLines(const QVector<QLine> &lines)
void drawLines(const QPoint *pointPairs, int lineCount)
void drawLines(const QVector<QPoint> &pointPairs)

5.drawPolygon()

画多边形

6.drawRoundRect()

圆角矩形

7.drawEllipse()

椭圆
void drawEllipse(const QRectF &rectangle)
void drawEllipse(const QRect &rectangle)
void drawEllipse(int x, int y, int width, int height)
void drawEllipse(const QPointF &center, qreal rx, qreal ry)
void drawEllipse(const QPoint &center, int rx, int ry)

8.drawPolyLine()

9.drawPixmap()

10.drawText()

文本

11.drawConvexPolygon()

void drawConvexPolygon(const QPointF *points, int pointCount)
void drawConvexPolygon(const QPolygonF &polygon)
void drawConvexPolygon(const QPolygon &polygon)

*point是数组;pointCount是点个数

使用当前钢笔绘制数组点中的第一个pointCount点定义的凸多边形。第一个点隐式连接到最后一个点,多边形由当前画笔()填充。如果所提供的多边形不是凸的,即它至少包含一个大于180度的角,则结果是不确定的。在一些平台上(例如X11), drawConvexPolygon()函数可以比drawPolygon()函数更快。

static const QPointF points[4] = {
    QPointF(10.0, 80.0),
    QPointF(20.0, 10.0),
    QPointF(80.0, 30.0),
    QPointF(90.0, 70.0)
};

QPainter painter(this);
painter.drawConvexPolygon(points, 4);

12.drawPath()

void drawPath(const QPainterPath &path)
使用当前的画笔绘制轮廓和当前的画笔填充给定的画家路径。

    QPainter p(this);
    p.setPen(pen);
    p.setBrush(brush);
    QPainterPath path;
    path.addRect(100,100,200,200);
    path.moveTo(300,200);
    path.arcTo(100,100,200,200,00.0f,180.0f);
    path.closeSubpath();
    p.drawPath(path);

13.drawPixmap()

画像素
void drawPixmap(const QRectF &target, const QPixmap &pixmap, const QRectF &source)

void drawPixmap(const QRect &target, const QPixmap &pixmap, const QRect &source)

void drawPixmap(int x, int y, int w, int h, const QPixmap &pixmap, int sx, int sy, int sw, int sh)

void drawPixmap(int x, int y, const QPixmap &pixmap, int sx, int sy, int sw, int sh)

void drawPixmap(const QPointF &point, const QPixmap &pixmap, const QRectF &source)

void drawPixmap(const QPoint &point, const QPixmap &pixmap, const QRect &source)

void drawPixmap(const QPointF &point, const QPixmap &pixmap)

void drawPixmap(const QPoint &point, const QPixmap &pixmap)

void drawPixmap(int x, int y, const QPixmap &pixmap)常用

void drawPixmap(const QRect &rectangle, const QPixmap &pixmap)

void drawPixmap(int x, int y, int width, int height, const QPixmap &pixmap)常用

14.drawPoint()

画单个点
void drawPoint(const QPointF &position)

void drawPoint(const QPoint &position)

void drawPoint(int x, int y)

15.drawPoints()

画多个点
void drawPoints(const QPointF *points, int pointCount)
*point为数组名,pointCount为个数
void drawPoints(const QPolygonF &points)
void drawPoints(const QPoint *points, int pointCount)
void drawPoints(const QPolygon &points)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

m晴朗

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值