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. Nginx配置Https缺少SSL模块(已解决)

    1.Linux下Nginx配置https nginx下载和安装此处就忽略,可自行百度 1.1.配置https 打开nginx配置文件 vim /usr/local/nginx/conf/nginx.c ...

  2. 单节点kafka部署笔记

    1 背景 因为工作中需要对接kafka,准备在测试环境中自己部署一套,考虑方便决定部署一台单点. 2 部署 2.1 scala 2.1.1 java环境 openjdk即可,我使用的是openjdk1 ...

  3. 2021-7-29 MySql的简单使用

    创建表格   先判断users表是否存在,然后设置user_id为无符号(UNSIGNED)自动增长(AUTO_INCREMENT)的整型 并通过PRIMARY KEY设置user_id为主键 ENG ...

  4. 钟表练习 html+css实现

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  5. AI 一键去水印:教你无限量使用商业图片的技巧

    场景再现 刚开始注册账号(啥账号具体不表了,小编不喜欢的那个),想弄个闪亮,好看,有个性化的 Logo.作为一名非专美工小白人员,网上翻了很久作图工具,要么就是不好用,好用的大部分都收费.最后没办法, ...

  6. XAML格式化工具:XAML Styler

    XAML格式化的意义 在开发WPF应用过程中,编写XAML时需要手动去缩进或者换行,随着时间的推移或者参与开发的人增多,XAML文件内容的格式会越来越乱.要么属性全都写在一行,内容太宽一屏无法完整展现 ...

  7. Spring Cloud OpenFeign 的使用及踩坑指南

    目录 Feign 和OpenFeign Feign OpenFeign openFeign的优势 OpenFeign应用 1. 导入依赖 2. 使用 3. 日志配置 4. 数据压缩 OpenFeign ...

  8. GrapeCity Documents V6.0 Update 2发布,新增支持SpreadJS的.sjs文件格式

    近日,GrapeCity Documents 正式迎来其V6.2 的发布更新,能够支持 SpreadJS 中 .sjs 类型的文件.这一重大更新将为用户带来更多地惊喜. .sjs文件有两个关键优势:空 ...

  9. jdk17下netty导致堆内存疯涨原因排查

    背景: 介绍 天网风控灵玑系统是基于内存计算实现的高吞吐低延迟在线计算服务,提供滑动或滚动窗口内的count.distinctCout.max.min.avg.sum.std及区间分布类的在线统计计算 ...

  10. 弹性数据库连接池探活策略调研(一)——HikariCP

    调研背景: 数据库连接建立是比较昂贵的操作(至少对于 OLTP),不仅要建立 TCP 连接外还需要进行连接鉴权操作,所以客户端通常会把数据库连接保存到连接池中进行复用.连接池维护到弹性数据库(JED) ...