简述

QPainterPath 类(绘图路径)提供了一个容器,用于绘图操作,可以创建和重用图形形状。

绘图路径是由许多图形化的构建块组成的对象,例如:矩形、椭圆、直线和曲线。构建块可以加入在封闭的子路径中,例如:矩形或椭圆。封闭的路径的起点和终点是一致的,或者他们可以作为未封闭的子路径独立存在,如:直线和曲线。

QPainterPath 可以被填充、描绘轮廓、裁剪。要为一个指定的绘图路径生成可填充的轮廓,可以使用 QPainterPathStroker 类。与正常绘图相比,QPainterPath 的主要优点在于:复杂的图形只需创建一次,然后只需调用 QPainter::drawPath() 函数即可绘制多次。

QPainterPath 提供了一组函数,可用于获取绘图路径及其元素的信息。除了可以使用 toReversed() 函数来改变元素的顺序外,还有几个函数将 QPainterPath 对象转换成一个多边形表示。

| 版权声明:一去、二三里,未经博主允许不得转载。

创建 QPainterPath

QPainterPath 对象可以用指定的起点,或者另一个 QPainterPath 对象的副本来构造一个空路径。

一旦创建,可以使用 lineTo()、arcTo()、cubicTo() 和 quadTo() 函数将直线和曲线添加到路径中,直线和曲线从 currentPosition() 处伸展到其传递的参数的所在点的位置。

QPainterPath 对象的 currentPosition() 始终是最后一个添加的子路径的最终位置(或初始起点),使用 moveTo() 函数可以在不增加组件的情况下移动 currentPositon(),moveTo() 函数会隐式地启动一个新的子路径,并关闭前一个。启动新的子路径的另一种方式是调用 closeSubpath() 函数,该函数通过添加一条直线(从 currentPosition() 到起始位置)来关闭当前路径。注意:新路径将 (0, 0) 作为其初始 currentPosition()。

QPainterPath 也提供了一些便利的函数来添加一个封闭的子路径 - addEllipse()、addPath()、 addRect()、addRegion() 和 addText()。addPolygon() 函数添加一个未封闭的子路径。事实上,这些函数都是 moveTo()、lineTo()、cubicTo() 操作的集合。

此外,使用 connectPath() 函数将路径添加至当前路径。但需要注意,该函数将通过添加一条直线,将当前路径的最后一个元素连接到给定的第一个元素。

QPainterPath 信息

QPainterPath 类提供了一组函数,用于返回有关该路径及其元素的信息。

currentPosition() 函数返回被添加的最后一个子路径的终点(或初始起始点)。elementAt() 函数可用于检索各种子路径元素,可以使用 elementCount() 函数检索元素的数量,isEmpty() 函数可以告诉该 QPainterPath 对象是否包含任何元素。

controlPointRect() 函数返回包含此路径中所有点和控制点的矩形。与使用浮点精度返回此画家路径的边界矩形的精确的 boundingRect() 相比,此函数的计算速度要快得多。

最后,QPainterPath 提供了 contains() 函数,用于确定给定点或矩形是否在路径内。以及 intersects() 函数,用于确定给定矩形内的任何点是否也在该路径内。

QPainterPath 转换

出于兼容性原因,可能需要简化绘图路径的表示形式:QPainterPath 提供的 toFillPolygon()、toFillPolygons()和 toSubpathPolygons() 函数,用于将绘图路径转换为多边形。toFillPolygon() 将绘图路径作为单个多边形返回,而后两个函数返回一个多边形列表。

提供了 toFillPolygons() 和 toSubpathPolygons() 函数,因为绘制几个小多边形通常比绘制一个大的多边形更快,即使绘制的总点数相同。两者之间的差异是它们返回的多边形数:toSubpathPolygons() 为每个子路径创建一个多边形,而不管相交的子路径(即重叠的边界矩形),而 toFillPolygons() 函数仅为重叠的子路径创建一个多边形。

toFillPolygon() 和 toFillPolygons() 函数首先将所有子路径转换为多边形,然后使用重卷技术确保可以使用正确的填充规则来填充重叠的子路径。注意:重卷会在多边形中插入额外的线,因此填充多边形的轮廓与路径的轮廓不匹配。

椭圆

void QPainterPath::addEllipse(const QRectF & boundingRectangle)

在指定的 boundingRectangle 内创建一个椭圆,并将其作为一个封闭的子路径添加至绘图路径中。

椭圆由顺时针曲线组成,起始点和结束点在 0°(3 点钟的位置)。

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

多边形

void QPainterPath::addPolygon(const QPolygonF & polygon)

将指定的 polygon 作为子路径(未封闭)添加至绘图路径中。

注意:添加了 polygon 后,当前位置是 polygon 的最后一个点。要画一条线回到起始点,使用 closeSubpath() 函数。

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

矩形

void QPainterPath::addRect(const QRectF & rectangle)

将指定的 rectangle 作为子路径(封闭)添加至绘图路径中。

rectangle 作为顺时针的一组线被添加。添加 rectangle 后,绘图路径的当前位置是 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 QPainterPath::addText(const QPointF & point, const QFont & font, const QString & text)

将指定的 text 添加至此路径中,作为由 font 创建的一组封闭子路径。定位子路径,使 text 基线的左端位于指定的 point。

QLinearGradient myGradient;
QPen myPen;
QFont myFont;
QPointF baseline(x, y);QPainterPath myPath;
myPath.addText(baseline, myFont, tr("Qt"));QPainter painter(this);
painter.setBrush(myGradient);
painter.setPen(myPen);
painter.drawPath(myPath);

弧形

void QPainterPath::arcTo(const QRectF & rectangle, qreal startAngle, qreal sweepLength)

创建一个弧形,占据了指定的 rectangle,以指定 startAngle 开始并逆时针扩展 sweepLength 度。

角度都以度为单位,可以用负角度来指定顺时针弧形。

注意:如果它们尚未连接,此函数将连接弧的起点到当前位置。弧形被加入后,当前位置是弧的最后一点。要画一条线回到起始点,使用 closeSubpath() 函数。

QLinearGradient myGradient;
QPen myPen;QPointF center, startPoint;QPainterPath myPath;
myPath.moveTo(center);
myPath.arcTo(boundingRect, startAngle,sweepLength);QPainter painter(this);
painter.setBrush(myGradient);
painter.setPen(myPen);
painter.drawPath(myPath);

贝塞尔曲线

void QPainterPath::cubicTo(const QPointF & c1, const QPointF & c2, const QPointF & endPoint)

使用指定的控制点 c1、c2,在当前位置和指定的 endPoint 之间添加一条贝塞尔曲线。

曲线被添加后,当前位置会被更新为曲线的终点。

QLinearGradient myGradient;
QPen myPen;QPainterPath myPath;
myPath.cubicTo(c1, c2, endPoint);QPainter painter(this);
painter.setBrush(myGradient);
painter.setPen(myPen);
painter.drawPath(myPath);

填充规则

Qt 提供了两种填充路径的规则:

Qt::OddEvenFill (默认) Qt::WindingFill

Qt 之图形(QPainterPath)相关推荐

  1. Qt用户图形界面设计应用(闹钟)

    Qt用户图形界面设计应用(闹钟) 一.Qt介绍 什么是Qt Qt 是一个跨平台的 C++ 图形用户界面库,由挪威 TrollTech 公司于 1995 年底出品,并于 2008年6月17日被NOKIA ...

  2. Qt之图形(简笔画-绘制卡通蚂蚁)

    简述 关于简笔画的介绍很多,有动物.水果.蔬菜.交通工具等,通常会对绘制一步步进行拆分.组合.然后绘制为我们想要的结果. 下面来介绍另外的一个种类:昆虫类-卡通蚂蚁. 简述 绘制 效果 源码 绘制 效 ...

  3. Qt 之图形(简笔画-绘制卡通蚂蚁)

    简述 关于简笔画的介绍很多,有动物.水果.蔬菜.交通工具等,通常会对绘制一步步进行拆分.组合.然后绘制为我们想要的结果. 下面来介绍另外的一个种类:昆虫类-卡通蚂蚁. | 版权声明:一去.二三里,未经 ...

  4. QT嵌入式之_QT介绍_安装_以及环境变量配置---QT嵌入式图形框架工作笔记001

    WPS也是用qt开发的,用qt开发,主要是可以方便的移植到各种平台,以及嵌入式平台. 也可以用QT来开发,在STM32平台运行的程序. 对于网络编程来说,如果我们基于传统的套接字来开发,会很慢,麻烦, ...

  5. 项目实战-图像识别项目-通过QT制作图形界面并调用百度AI进行图像识别(一)

    转自迅为4412开发板项目实战教程 B站视频地址:https://www.bilibili.com/video/BV157411c7sc?p=7 硬件平台:iTOP-4412开发板 项目名称:图像识别 ...

  6. QT OpenGL图形放大缩小旋转移动

    由于要在OpenGL中实现放大缩小旋转和移动的效果,故要重写鼠标事件 放大缩小 重写void wheelEvent(QWheelEvent *event)函数 void zScale(float dz ...

  7. app inventor调用图像识别_项目实战-图像识别项目-通过QT制作图形界面并调用百度AI进行图像识别(一)...

    转自迅为4412开发板项目实战教程 硬件平台:iTOP-4412开发板 项目名称:图像识别项目 本文我们来学习利用QT构建一个图形界面并用QT调用百度AI的接口 一.添加arm编译套件 打开QT cr ...

  8. Qt 之图形(组合)

    简述 使用QPainter绘制图形或者图像时,在重叠区域使用组合模式(Composition_mode).在绘图设备上通过组合模式使用QImage时,必须使用Format_ARGB32_Premult ...

  9. Qt之图形(简笔画-绘制漂亮的西瓜)

    简述 Summer is coming-我们呢,为大家准备了丰盛的佳果-西瓜,清爽解渴,甘味多汁. 一笔一划学简笔画,分分钟让你掌握一门新技能,下面我们来绘制一个"盛夏之王"-西瓜 ...

最新文章

  1. windows中进程详解
  2. 图解Windows域的命令行操作
  3. VBS随时监视注册表的变化,记录有变化的值或键等信息(包括一个文件内容比较函数)...
  4. 学习10:Python重要知识
  5. 【51nod - 1875】 丢手绢(约瑟夫问题,可打表,用STL模拟)
  6. vc 通过句柄修改窗口大小_VC应用(1)通过VC修改销售订单行项目的字段
  7. java 根据条件从list中筛选出符合条件的集合_Java8 Stream:2万字20个实例,玩转集合的筛选、归约、分组、聚合
  8. 903计算机技术综合基础,北大903计算机技术综合基础考研真题、资料、参考书
  9. Silverlight 的文本框自动完成(AutoComplete)
  10. Firefly是什么?有什么特点?
  11. OpenCore启动项中无Install macOS Big Sur 的解决办法
  12. 《大数据技术原理与应用》(第三章 HDFS 课后答案)
  13. PHP后台管理登录界面代码
  14. linux程序设计——个人总结
  15. 什么是波特率,波特率怎么计算
  16. Spring中Junit测试启动报错class path resource [xxx.xml] cannot be opened because it does not exist
  17. 将域名解析到空间服务器,如何把域名解析到空间
  18. 怎样把已经做好的网页传到网上去?
  19. vhall微吼中的视频无法通过左右方向键来快进和快退的解决方法
  20. python 是否可以一键修图_一键修图功能强大吗?想知道哪个软件比较好用?

热门文章

  1. MySql计算两日期时间之间相差的天数,秒数,分钟数,周数,小时数
  2. Simpsons’ Hidden Talents(扩展KMP)
  3. linux驱动系列学习之OLED(i2c接口)(八)
  4. 【codevs 2913】建筑抢修
  5. PhotoshopCS6常用快捷键速查
  6. 安装miniconda出现丢失api-mis-win-core-path-l1-1-0.dll的解决方案
  7. Spring系列学习之Spring Integration
  8. MySQL的rollback--事务回滚
  9. 杭电OJ 1095(C++)
  10. 「州晖」固定支架、活动支吊架、抗震支架简介