百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分类 > 正文

Qt 图形(QPainterPath)(qt图形界面教程)

ztj100 2025-04-08 20:53 19 浏览 0 评论

简述

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点钟的位置)。

效果

源码

 1 QLinearGradient myGradient;
 2 QPen myPen;
 3 QRectF boundingRectangle;
 4 
 5 QPainterPath myPath;
 6 myPath.addEllipse(boundingRectangle);
 7 
 8 QPainter painter(this);
 9 painter.setBrush(myGradient);
10 painter.setPen(myPen);
11 painter.drawPath(myPath);

多边形

void QPainterPath::addPolygon(const QPolygonF & polygon)

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

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

效果

源码

 1 QLinearGradient myGradient;
 2 QPen myPen;
 3 QPolygonF myPolygon;
 4 
 5 QPainterPath myPath;
 6 myPath.addPolygon(myPolygon);
 7 
 8 QPainter painter(this);
 9 painter.setBrush(myGradient);
10 painter.setPen(myPen);
11 painter.drawPath(myPath);

矩形

void QPainterPath::addRect(const QRectF & rectangle)

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

效果

源码

 1 QLinearGradient myGradient;
 2 QPen myPen;
 3 QRectF myRectangle;
 4 
 5 QPainterPath myPath;
 6 myPath.addRect(myRectangle);
 7 
 8 QPainter painter(this);
 9 painter.setBrush(myGradient);
10 painter.setPen(myPen);
11 painter.drawPath(myPath);

文本

void QPainterPath::addText(const QPointF & point, const QFont & font, const QString & text)

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

效果

源码

 1 QLinearGradient myGradient;
 2 QPen myPen;
 3 QFont myFont;
 4 QPointF baseline(x, y);
 5 
 6 QPainterPath myPath;
 7 myPath.addText(baseline, myFont, tr("Qt"));
 8 
 9 QPainter painter(this);
10 painter.setBrush(myGradient);
11 painter.setPen(myPen);
12 painter.drawPath(myPath);

弧形

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

创建一个弧,占据了给定的矩形,开始在指定startAngle和扩展sweepLength度逆时针。

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

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

效果

源码

 1 QLinearGradient myGradient;
 2 QPen myPen;
 3 
 4 QPointF center, startPoint;
 5 
 6 QPainterPath myPath;
 7 myPath.moveTo(center);
 8 myPath.arcTo(boundingRect, startAngle,
 9              sweepLength);
10 
11 QPainter painter(this);
12 painter.setBrush(myGradient);
13 painter.setPen(myPen);
14 painter.drawPath(myPath);

贝塞尔曲线

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

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

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

效果

源码

 1 QLinearGradient myGradient;
 2 QPen myPen;
 3 
 4 QPainterPath myPath;
 5 myPath.cubicTo(c1, c2, endPoint);
 6 
 7 QPainter painter(this);
 8 painter.setBrush(myGradient);
 9 painter.setPen(myPen);
10 painter.drawPath(myPath);

填充规则

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

Qt::OddEvenFill (默认)

Qt::WindingFill

Qt 图形(QPainterPath)

相关推荐

其实TensorFlow真的很水无非就这30篇熬夜练

好的!以下是TensorFlow需要掌握的核心内容,用列表形式呈现,简洁清晰(含表情符号,<300字):1.基础概念与环境TensorFlow架构(计算图、会话->EagerE...

交叉验证和超参数调整:如何优化你的机器学习模型

准确预测Fitbit的睡眠得分在本文的前两部分中,我获取了Fitbit的睡眠数据并对其进行预处理,将这些数据分为训练集、验证集和测试集,除此之外,我还训练了三种不同的机器学习模型并比较了它们的性能。在...

机器学习交叉验证全指南:原理、类型与实战技巧

机器学习模型常常需要大量数据,但它们如何与实时新数据协同工作也同样关键。交叉验证是一种通过将数据集分成若干部分、在部分数据上训练模型、在其余数据上测试模型的方法,用来检验模型的表现。这有助于发现过拟合...

深度学习中的类别激活热图可视化

作者:ValentinaAlto编译:ronghuaiyang导读使用Keras实现图像分类中的激活热图的可视化,帮助更有针对性...

超强,必会的机器学习评估指标

大侠幸会,在下全网同名[算法金]0基础转AI上岸,多个算法赛Top[日更万日,让更多人享受智能乐趣]构建机器学习模型的关键步骤是检查其性能,这是通过使用验证指标来完成的。选择正确的验证指...

机器学习入门教程-第六课:监督学习与非监督学习

1.回顾与引入上节课我们谈到了机器学习的一些实战技巧,比如如何处理数据、选择模型以及调整参数。今天,我们将更深入地探讨机器学习的两大类:监督学习和非监督学习。2.监督学习监督学习就像是有老师的教学...

Python教程(三十八):机器学习基础

...

Python 模型部署不用愁!容器化实战,5 分钟搞定环境配置

你是不是也遇到过这种糟心事:花了好几天训练出的Python模型,在自己电脑上跑得顺顺当当,一放到服务器就各种报错。要么是Python版本不对,要么是依赖库冲突,折腾半天还是用不了。别再喊“我...

超全面讲透一个算法模型,高斯核!!

...

神经网络与传统统计方法的简单对比

传统的统计方法如...

AI 基础知识从0.1到0.2——用“房价预测”入门机器学习全流程

...

自回归滞后模型进行多变量时间序列预测

下图显示了关于不同类型葡萄酒销量的月度多元时间序列。每种葡萄酒类型都是时间序列中的一个变量。假设要预测其中一个变量。比如,sparklingwine。如何建立一个模型来进行预测呢?一种常见的方...

苹果AI策略:慢哲学——科技行业的“长期主义”试金石

苹果AI策略的深度原创分析,结合技术伦理、商业逻辑与行业博弈,揭示其“慢哲学”背后的战略智慧:一、反常之举:AI狂潮中的“逆行者”当科技巨头深陷AI军备竞赛,苹果的克制显得格格不入:功能延期:App...

时间序列预测全攻略,6大模型代码实操

如果你对数据分析感兴趣,希望学习更多的方法论,希望听听经验分享,欢迎移步宝藏公众号...

AI 基础知识从 0.4 到 0.5—— 计算机视觉之光 CNN

...

取消回复欢迎 发表评论: