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)

QPainter和QPainterPath理解的更多相关文章

  1. QPainter、QPainterPath、QBrush

    参考资料: https://blog.csdn.net/qq_35488967/article/details/70802973https://blog.csdn.net/wanghualin033/ ...

  2. Qt之自定义控件(开关按钮)

    简述 接触过IOS系统的童鞋们应该对开关按钮很熟悉,在设置里面经常遇到,切换时候的滑动效果比较帅气. 通常说的开关按钮,有两个状态:on.off. 下面,我们利用自定义控件来实现一个开关按钮. 简述 ...

  3. QT状态机

    首先吐槽下网上各种博主不清不楚的讲解 特别容易让新手迷惑 总体思想是这样的:首先要有一个状态机对象, 顾名思义,这玩意就是用来容纳状态的.然后调用状态机的start()函数它就会更具你的逻辑去执行相关 ...

  4. QGraphicsItem鼠标精准拾取(pick/select)研究

    在QT场景视图中,一个2D图形项是一个QGraphicsItem,我们可以通过继承来定义我们自己的图形项. 主要有以下三个虚函数需要重点关注: 1)   边界矩形(必须实现) virtual QRec ...

  5. [Qt2D绘图]-04绘制文字&&绘制路径

    注:学习自<Qt Creator 快速入门>第三版.   文档中的示例参考 Qt Example推荐:Painter Paths Example和Vector Deformation   ...

  6. 关于QT的QPainterPath::arcTo 详解

    这个函数文档的意思就是画弧,看了文档也不太明白,自己做了demo终于明白了意思 移动到圆心,画180度半圆 void TestArcTo::paintEvent(QPaintEvent *) { QP ...

  7. Qt开发中的实用笔记一--xml,Qpainter,Delegate:

    因为开发环境不能联网,开发中用到有用的知识就记在word稳定中,不知不觉就记载了几十页,为避免笔记丢失,现在就一点点忘博客上搬,方便日后回顾! ---------------------------- ...

  8. QPainter类学习

    详细描述: QPainter类提供了许多高度优化的函数去做大部分的GUI绘制工作.它可以画从简单的线到复杂的形状.通常情况下,QPainter的使用是在widget当中的painter事件使用.记得在 ...

  9. Qt学习之路(24): QPainter(改写paintEvent)

    多些大家对我的支持啊!有朋友也提出,前面的几节有关event的教程缺少例子.因为event比较难做例子,也就没有去写,只是把大概写了一下.今天带来的是新的部分,有关Qt的2D绘图.这部分不像前面的内容 ...

  10. QPainterPath 不规则提示框

    currentPosition()是最后一次绘制后的“结束点”(或初始点),使用moveTo()移动currentPosition()而不会添加任何元素. QPainterPath ​合并: 1.方法 ...

随机推荐

  1. Day11_Java_作业

    1:递归那个兔子对数练习题 有一对兔子,从出生后第3个月起每个月都生一对兔子,小兔子长到第三个月后每个月又生一对兔子,假如兔子都不死,问第二十个月的兔子对数为多少?(使用递归去解决) 2:定义一个数组 ...

  2. matlab2014a破解不完全,报错Test checkout of feature 'Compiler' failed

    解决方案 报错情况: 目标是把.m文件转化为.exe文件,先运行 mcc -m 你的文件.m 如果报错 Test checkout of feature 'Compiler' failed 是因为你的 ...

  3. MIT6.s081/6.828 lectrue1:Introduction and examples

    目前课程官网能够查到 2020,2021.2022 秋季的课程表,但是视频都是 2020 年录制的那一版 简单复习+回顾下自己的 OS 学习之旅 参考资料: 官网:https://pdos.csail ...

  4. Python数据分析易错知识点归纳(二):Numpy

    二.numpy 不带括号的基本属性 arr.dtype arr.shape # 返回元组 arr.size arr.ndim # 维度 arr.reshape/arr.resize/np.resize ...

  5. Cilium系列-1-Cilium特色 功能及适用场景

    系列文章 Cilium 系列文章 Cilium 简介 Cilium 是一个开源的云原生解决方案,用于提供.保护(安全功能)和观察(监控功能)工作负载之间的网络连接,由革命性的内核技术 eBPF 提供动 ...

  6. Postgresql: 常用配置

    允许远程链接postgresql 要允许 PostgreSQL 数据库允许远程连接,需要进行以下配置步骤: 打开 PostgreSQL 的主配置文件 postgresql.conf.通常,该文件位于以 ...

  7. CSS:粘性定位 使正文标题置顶

    案例效果 关键代码 代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset=&q ...

  8. 遥遥领先 spring,中国人的 solon 来啦!10% 的体积,10倍的速度

    Solon 是什么? Java 生态型应用开发框架.它从零开始构建,有自己的标准规范与开放生态(历时五年,已有全球第二级别的生态规模).与其他框架相比,它解决了两个重要的痛点:启动慢,费内存.2023 ...

  9. 前瞻|Java 21 新特性 String Templates(字符串模版)

    在日常写Java的时候,对于字符串的操作是非常普遍的,其中最常见的就是对字符串的组织.也因为这个操作非常普遍,所以诞生了很多方案,总下来大概有这么几种: 使用+拼接 使用StringBuffer和Sp ...

  10. 月工资不到10元的内容审核专员? - ChatGPT 在内容自动审查中的应用

    内容过滤筛查是指对网络上发布或传播的文本.图片.视频等内容进行审核和监管,以防止出现违法违规.暴力色情.虚假广告.电信诈骗等现象,维护网络安全和社会秩序. 内容过滤筛查是一个亟待解决的问题,因为网络内 ...