Qt之图形(QPainterPath)

简述

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

QPainterPath是一个图形构建块的对象,如矩形、椭圆、直线和曲线。构建块可以加入在封闭的子路径中,例如:矩形或椭圆形。一个封闭的路径同时存在开始点和结束点。或者作为未封闭的子路径独立存在,如:直线和曲线。

QPainterPath可以进行填充、显示轮廓和裁剪。要生成可填充的轮廓的绘图路径,可以使用QPainterPathStroker类。QPainterPath比正常绘制的主要优点在于:复杂的图形只需创建一次,然后可以仅仅通过调用QPainter::drawPath()函数来进行多次绘制。

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

QPainterPath对象可以构造一个空的路径,用给定的起点,或者另一个QPainterPath对象的副本。一旦创建,可以使用lineTo()、arcTo()、cubicTo()和quadTo()函数将直线和曲线添加到路径中。直线和曲线从currentPosition()到作为参数传递的点的位置拉伸。

直线和曲线从currentPosition()开始绘制。currentPosition()总是返回最后的子路经绘制的终点。使用moveTo()函数可以在不增加路径的情况下移动currentPositon(),它关闭了一个子路径,开始一个新的子路径。closeSubPath()也可以关闭当前路径,并从currentPosition()连接一条直线到绘图路径的起点。

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

  • 简述
  • 椭圆
    • 效果
    • 源码
  • 多边形
    • 效果
    • 源码
  • 矩形
    • 效果
    • 源码
  • 文本
    • 效果
    • 源码
  • 弧形
    • 效果
    • 源码
  • 贝塞尔曲线
    • 效果
    • 源码
  • 填充规则

Qt提供了Painter Paths ExampleVector Deformation example示例,分别位于Qt的例子目录下。

它们分别介绍了如何通过QPainterPath来构建复杂的形状,让用户尝试填充和描边。以及展示了如何使用QPainterPath绘制文本。

椭圆

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)

将给定的多边形添加到路径作为子路径(未封闭)。

注意:添加了多边形后的当前位置,是多边形的最后一点。要回到起始点画一条线,使用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)

将给定的矩形添加到绘制路径作为一个封闭的子路径。矩形添加作为一个顺时针的一组线。添加了矩形后,绘制路径的当前位置是矩形的左上角。

效果

源码

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)

将给定的文本添加到此路径,做为一组封闭的子路径从字体创建提供。定位子路径,使文本的基线的左端在指定的点。

效果

源码

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)

创建一个弧,占据了给定的矩形,开始在指定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。

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

效果

源码

QLinearGradient myGradient;
QPen myPen;

QPainterPath myPath;
myPath.cubicTo(c1, c2, endPoint);

QPainter painter(this);
painter.setBrush(myGradient);
painter.setPen(myPen);
painter.drawPath(myPath);

填充规则

设置绘制路径给出fillRule的填充规则。Qt提供了填充规则,方法有两种:

Qt::OddEvenFill (默认) Qt::WindingFill
时间: 2024-11-03 17:35:52

Qt之图形(QPainterPath)的相关文章

Q4Wine 0.999-rc7发布 Qt 4 图形用户界面

Q4Wine 是一款用于 Wine 应用的Qt 4 http://www.aliyun.com/zixun/aggregation/18378.html">图形用户界面,帮助您管理Wine前缀和安装的应用程序.它可以将Qt颜色主题导出到Wine的颜色设置,支持同一时间的不同Wine版本,支持自动启动的图标,可以从PE文件中提取图标. Q4Wine 0.999-rc7该版本进行一些错误的修复. 软件信息:http://q4wine.brezblock.org.ua/ 下载地址:http://

Qt之图形(绘制漂亮的圆弧)

简述 综合前面对二维绘图的介绍,想必我们对一些基本绘图有了深入的了解,下面我们来实现一些漂亮的图形绘制. 简述 圆形 效果 源码 弧形 效果 源码 文本 效果 源码 旋转 效果 源码 圆形 经常地,我们会在网上看到一些列的抽奖活动,里面就有圆盘抽奖,是不是有点手痒了O(∩_∩)O~ 效果 源码 void MainWindow::paintEvent(QPaintEvent *) { QPainter painter(this); painter.setRenderHint(QPainter::A

Qt之图形视图框架

简述 图形视图(Graphics View)提供了一个平台,用于大量自定义2D图元的管理与交互,并提供了一个视图部件(view widget)来显示可以缩放和旋转的图元. 框架包括一个事件传播架构,支持场景(Scene)中的图元(Item)进行精确的双精度交互功能.图元可以处理键盘事件.鼠标按下.移动.释放和双击事件,同时也能跟踪鼠标移动. 图形视图使用一个BSP(Binary Space Partitioning - 二叉空间分割)树,以提供对图形元素的快速查找,正因为如此,它可以使超大的场景

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

简述 关于简笔画的介绍很多,有动物.水果.蔬菜.交通工具等,通常会对绘制一步步进行拆分.组合.然后绘制为我们想要的结果. 下面来介绍另外的一个种类:昆虫类-卡通蚂蚁. 简述 绘制 效果 源码 绘制 效果 具体的效果如下所示,我们可以再进行更好的完善. 源码 主要分为以下三部: 绘制屁股 绘制肚子 绘制头部 注意:绘制的时候,由于各个部分的颜色不同,而且坐标不好定位,所以我们采用的图形覆盖的方式. void MainWindow::paintEvent(QPaintEvent *) { QPain

Qt之图形(QPainter的基本绘图)

简述 Qt中提供了强大的2D绘图系统,可以使用相同的API在屏幕和绘图设备上进行绘制,它主要基于QPainter.QPaintDevice和QPaintEngine这三个类. QPainter用来执行绘图操作,其提供的API在GUI或QImage.QOpenGLPaintDevice.QWidget和QPaintDevice显示图形(线.形状.渐变等).文本和图像. QPaintDevice不直接绘制物理显示画面,而利用逻辑界面的中间媒介.例如,绘制矩形图形时,为了将对象绘制到QWidget.Q

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

简述 Summer is coming-我们呢,为大家准备了丰盛的佳果-西瓜,清爽解渴,甘味多汁. 一笔一划学简笔画,分分钟让你掌握一门新技能,下面我们来绘制一个"盛夏之王"-西瓜,赶快一起来试试吧. 简述 简笔画 绘制 效果 源码 简笔画 我们先简单看看西瓜的基本组成,一步步进行拆分.组合. 绘制 效果 具体的效果如下所示,我们可以再进行更好的完善. 源码 主要分为以下三部: 绘制外圆(绿色部分) 绘制内圆(红色部分) 绘制椭圆(西瓜子) 注意:绘制西瓜子的时候,由于西瓜子随机分布在

Qt之图形(绘制文本)

简述 前面讲解了 Qt 图形的基本绘制,包括: 直线.弧线.矩形.椭圆.图片.多边形,以及其它一些高级用法,比如:渐变.转换等. 本节主要分享文本的绘制.主要通过 QPainter 的 darwText() 函数来实现,里面包含多个重载函数,其中,可以通过 QRect 来指定绘制的区域,也可以通过 QPoint 来指定绘制的起始点. QFont 类可以辅助设置文本的大小.粗细.字符间距等,然后使用 setFont() 来设置. QFontInfo 类用来获取字体的信息,可以通过 fontInfo

Qt之图形(转换)

简述 QTransform类指定坐标系的2D转换,可以指定平移.缩放.扭曲(剪切).旋转或投影坐标系.绘制图形时,通常会使用. QTransform与QMatrix的不同之处在于,它是一个真正的3x3矩阵,允许视角转换,QTransform的 toAffine()方法允许将QTransform转换到QMatrix.如果视角转换已在矩阵指定,则转换将导致数据丢失. 简述 常用接口 正常 效果 源码 平移 效果 源码 旋转 效果 源码 缩放 效果 源码 扭曲 效果 源码 常用接口 函数 描述 tra

Qt之图形(组合)

简述 使用QPainter绘制图形或者图像时,在重叠区域使用组合模式(Composition_mode).在绘图设备上通过组合模式使用QImage时,必须使用Format_ARGB32_Premultiplied和Format_ARGB32格式之一. 简述 效果 源码 更多参考 效果 源码 ... painter.drawImage(0, 0, destinationImage); painter.setCompositionMode(QPainter::CompositionMode_Dest