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. Oracle使用SQL截取某字符串

    很多小伙伴在使用Oracle的时候,想通过SQL来提取根据某一字符串截取来获得的字符串,他苦于对SQL不是很熟悉,但是现在你可以放心啦,现在先恭喜你找到了答案.因为在这里我已经为你写好了相关的函数以及 ...

  2. Blazor前后端框架Known-V1.2.9

    V1.2.9 Known是基于C#和Blazor开发的前后端分离快速开发框架,开箱即用,跨平台,一处代码,多处运行. Gitee: https://gitee.com/known/Known Gith ...

  3. GIT保存记录原理之commit对象

    GIT 中提交对象非常的重要,我们通过它记录代码提交过程.进行文件保存.回退等操作,那么它是怎样帮助我们记录这些信息的呢?其实就是都保存在项目根目录的 .git 文件夹中. 新建空项目 ```gitD ...

  4. debian11安装mysql5.7

    前言 mysql官网5.7版本的只找到debian10的,没有debian11的,试了下也能用. 系统版本:debian 11 mysql版本:5.7.35 步骤 下载bundle的tar包.官网地址 ...

  5. 安装win10虚拟机

    1.前期工作 下载win10镜像:zh-cn_windows_10_consumer_editions_version_21h1_updated_aug_2021_x64_dvd_4de56d76.i ...

  6. CodeForces 1187E Tree Painting

    题意:给定一棵\(n\)个点的树 初始全是白点 要求你做\(n\)步操作,每一次选定一个与一个黑点相隔一条边的白点,将它染成黑点,然后获得该白点被染色前所在的白色联通块大小的权值. 第一次操作可以任意 ...

  7. 2.9 PE结构:重建导入表结构

    脱壳修复是指在进行加壳保护后的二进制程序脱壳操作后,由于加壳操作的不同,有些程序的导入表可能会受到影响,导致脱壳后程序无法正常运行.因此,需要进行修复操作,将脱壳前的导入表覆盖到脱壳后的程序中,以使程 ...

  8. 电气工程师必学------CODESYS v3.5 入门学习笔记(一)

    一.新建工程 打开软件新建工程,如图 此教程只是入门练习,所以这里一般情况下都是创建的Standard project,也就是标准工程.窗口下方可以设置工程名称与存放位置. 紧接着是选择设备与编译语言 ...

  9. WPF开发必备

    类库 1.XamlFlair The goal of the XamlFlair library is to ease the implementation of common animations ...

  10. RabbitMQ保姆级教程最佳实践

    一.消息队列介绍 1.消息队列概念 1.MQ全称为Message Queue,消息队列(MQ)是⼀种应⽤程序对应⽤程序的通信⽅法. 应⽤程序通过读写出⼊队列的消息(针对应⽤程序的数据)来通信,⽽⽆需专 ...