注:学习自《Qt Creator 快速入门》第三版。
 
文档中的示例参考
Qt Example推荐:Painter Paths Example和Vector Deformation
 
大纲:
    绘制文字
    绘制路径
        path的填充规则
        QPainter中与path有关的常用函数
 
本篇涉及的Qt类: QPainter QFont QPainterPath
 
绘制文字 (QPainter::darwText())
除了绘制图形以外,还可以使用QPainter::darwText()函数来绘制文字,
还可以使用QPainter::setFont()设置文字所使用的字体,使用QPainter::fontInfo()函数可以获取字体的信息,它返回QFontInfo类对象。
绘制文字时会默认使用抗锯齿。
 
drawText()函数有很多重载。这里演示一个:
void QPainter::drawText(const QRectF &rectangle, int flags, const QString &text, QRectF *boundingRect = nullptr)
  • 第一个参数指定了绘制文字所在的矩形;
  • 第二个参数指定了文字在矩形中的对齐方式,它由Qt::AlignmentFlag枚举类型进行定义,不同对齐方式也可以使用按位或“|”操作符同时使用,这里还可以使用Qt::TextFlag定义的其他一些标志,比如自动换行等;
  • 第三个参数就是所要绘制的文字,这里可以使用“\n”来实现换行;
  • 第四个参数一般不用设置。
如果绘制的文字和它的布局不用经常改动,那么也可以使用drawStaticText。
 painter.drawStaticText(QPoint(, ),
QStaticText(QString("hello use drawStaticText")));
 
绘制路径 (QPainter::drawPath(path))
如果要绘制一个复杂的图形,尤其是要重复绘制复杂的图形,可以使用QPainterPath类,并使用QPainter: :drawPath()进行绘制。
QPainterPath类为绘制操作提供了一个容器,可以用来创建图形并且重复使用。
一个绘图路径就是由多个矩形、椭圆、线条或者曲线等组成的对象,一个路径可以是封闭的,如矩形和椭圆;也可以是非封闭的,如线条和曲线。
 
void Widget::paintEvent(QPaintEvent *event) {
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing); QPainterPath path;
// 创建一个QPainterPath对象后就会以坐标原点为当前点进行绘制,
// 可以使用moveTo()函数改变当前点,移动当前点到点(50,250)
path.moveTo(, );
// 从当前点即(50,250)绘制一条直线到点(50,230).完成后当前点更改为(50,230)
path.lineTo(, );
//从当前点和点(120,60)之间绘制一条三次贝塞尔曲线
path.cubicTo(QPointF(, ), QPointF(, ), QPointF(, )); path.lineTo(, );
//向路径中添加一个椭圆
path.addEllipse(QPointF(130.0, 130.0), , );
// 绘制path
painter.drawPath(path); //平移坐标系统后再次绘制路径
path.translate(, );
painter.setPen(Qt::darkBlue);
painter.drawPath(path);
}
 
关于path路径"制作",主要是QpainterPath类的使用.
 
常用的方法:
可以使用lineTo()、arcTo()、cubicTo( )和quadTo()等函数将直线或者曲线添加到路径中;
cubicTo (const QPointF &cl, const QPointF &c2, const QPointF &endPoint)函数可以在当前点和endPoint点之间添加一个3次贝塞尔曲线;
quadTo()函数可以绘制一个二次贝塞尔曲线;
可以使用addEllipse()、addPath()、addRect()、addRegion()、addText()和addPolygon()来向路径中添加一些图形或者文字。
它们都从当前点开始进行绘制,绘制完成后以结束点作为新的当前点。这些图形都是由一组直线或者曲线组成.
currentPosition()函数获取当前点;
使用moveTo()函数改变当前点;
当组建好路径后可以使用drawPath()函数来绘制路径;
可以使用translate()函数将路径平移。
这也是QPainterPath的主要作用。
 
注:关于贝塞尔曲线来看一个书上的图:
 
path的填充规则 (Qt::FillRule)
path的填充有两个填充规则:
Qt::OddEvenFill(默认)和Qt::WindingFill。
QPainter painter(this);
QPainterPath path;
// 此path没有设置fillrule。则使用默认的Qt::OddEvenFill
path.addEllipse(,,,);
path.addRect(,,,);
painter.setBrush(Qt::cyan);
painter.drawPath(path); //此path手动设置填充规则
painter.translate(,);
path.setFillRule(Qt::WindingFill);
painter.drawPath(path);
运行结果:
 
FillRule的理论部分:
Qt::OddEvenFill使用的是奇偶填充规则.
具体来说就是:如果要判断一个点是否在图形中,那么可以从该点向图形外引一条水平线,如果该水平线与图形的交点的个数为奇
数,那么该点就在图形中。这个规则是默认值;
Qt::WindingFill使用的是非零弯曲规则.
具体来说就是:如果要判断一个点是否在图形中,那么可以从该点向图形外引一条水平线,
如果该水平线与图形的边线相交,这个边线是顺时针绘制的,就记为1;是逆时针绘制的就记为一1。然后将所有数值相加,如果结果不为0,那么该点就在图形中。
 
图10- 19是这两种规则的示意图,对于Qt::OddEvenFill规则,第一个交点记为1,第二个交点记为2;
对于Qt::WindingFill规则,因为椭圆和矩形都是以顺时针进行绘制的,所以各个交点对应的边都使用1来代表。
 
关于QPainter 的与path有关的常用函数:
QPainter::fillPath()来填一个路径;
QPainter::strokePath()函数来绘制路径的轮廓;
QPainterPath::elementAt()来获取路径中的一个元素;
QPainterPath::elementCount()获取路径中元素的个数;
QPainterPath::contains()函数来判断一个点是否在路径中;
QPainterPath::toFillPolygon()函数将路径转换为一个多边形。
...
本篇笔记的源代码
代码会整理到GitHub,如果没有请等待:https://github.com/tudouloveloli/QtExampleCode

[Qt2D绘图]-04绘制文字&&绘制路径的更多相关文章

  1. Qt 2D绘图之三:绘制文字、路径、图像、复合模式

    一.绘制文字 除了绘制图形以外,还可以使用QPainter::darwText()函数来绘制文字,也可以使用QPainter::setFont()设置文字所使用的字体,使用QPainter::font ...

  2. IOS开发 图形绘制,绘制线条,矩形,和垂直和居中绘制文字

    概述 吐槽下IOS下 的图形绘图,代码冗长,不得不自己重新封装方法.整理形成本文. 绘制线 // 绘制直线 + (void)toDrawLineFromX:(CGFloat)x1 Y:(CGFloat ...

  3. [Qt2D绘图]-01Qt2D绘图基本绘制和填充

    Qt的文档位置为 Paint System   大纲:     简介     先看一个小例子     基本的绘制和填充         使用画笔(Qpen)         使用画刷(QBrush) ...

  4. 学习Canvas绘图与动画基础 绘制多条路径(四)

    1 <!DOCTYPE html> 2 <html> 3 <head lang="en"> 4 <meta charset="U ...

  5. VB6 GDI+ 入门教程[4] 文字绘制

    http://vistaswx.com/blog/article/category/tutorial/page/2 VB6 GDI+ 入门教程[4] 文字绘制 2009 年 6 月 18 日 7条评论 ...

  6. html5--5-11 绘制文字

    html5--5-11 绘制文字 学习要点 掌握文字的绘制方法 文字的绘制方法 strokeText("文字",x,y,maxWith) 绘制(描边)空心文字 fillText(& ...

  7. Android之TextView文字绘制流程

    一:TextView的onDraw()方法: 1.第一句restartMarqueeIfNeeded()绘制字幕滚动. protected void onDraw(Canvas canvas) { r ...

  8. Canvas入门(3):图像处理和绘制文字

    来源:http://www.ido321.com/997.html 一.图像处理(非特别说明,所有结果均来自最新版Google) 在HTML 5中,不仅可以使用Canvas API绘制图形,也可以用于 ...

  9. 微信小程序生成海报分享:canvas绘制文字溢出如何换行

    主要思路: 1.先分割为字符串数组,然后一个字一个字绘图,利用ctx.measureText(string) 方法,获取绘制后的宽度,判断宽度在多少内就另起一行,再将各行拼成一个字符串 2.计算另起的 ...

随机推荐

  1. [置顶] linux中fork()函数详解(原创!!实例讲解)

    分类: 计算机系统 linux2010-06-01 23:35 60721人阅读 评论(105) 收藏 举报 linux2010存储  一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源 ...

  2. SpringBoot 启动配置原理

    几个重要的事件回调机制 ApplicationContextInitializer SpringApplicationRunListener ApplicationRunner CommandLine ...

  3. 2.WebPack初始化

    一.Package.json 在项目中输入: npm init 之后会提示你一步一步输入信息,我输入的信息如下: 生成的Package.json文件如下 我们也可以在初始时省略这些步骤,让脚本使用默认 ...

  4. 虹软人脸识别 - faceId及IR活体检测的介绍

    虹软人脸识别 - faceId及IR活体检测的介绍 前几天虹软推出了 Android ArcFace 2.2版本的SDK,相比于2.1版本,2.2版本中的变化如下: VIDEO模式新增faceId(类 ...

  5. centos下面基本的linux命令操作

    参考视频: 1.如何打开命令窗口 鼠标点击右键,选择open Terminal就可以打开命令行窗口了. 现在我们可以调整这个窗口的大小,增大窗口大小使用ctrl+shif+加号,缩小窗口ctrl+减号 ...

  6. 新版MySQL开始使用时遇到的问题(时区、权限):

    新版MySQL(本人Server version: 8.0.15)在刚开始使用时遇到的问题: 查看mysql安装版本:命令窗口 时区问题解决(The server time zone value 'Ö ...

  7. unable to load script from assets 'index.android bundle'

    在Android手机上运行React-native项目时 报错:unable to load script from assets 'index.android bundle'  ,make sure ...

  8. linux crontab 定时任务 邮件问题 及其相关的 dead.letter 问题

    最近开发项目的时候发现公司服务器用root账号登录的时候 一直会提示有新的信件,一直提示一直提示. 联想到另一台服务器上 的dead.letter文件每天都不断的变大  而且在 root家目录里 ,系 ...

  9. Python之浅谈装饰器

    目录 闭包函数 装饰器 迭代器 闭包函数 就是将原先需要调用好几遍的函数和参数写入一个包内,下次调用时一起调用 def name(x): x=1 def age(): print(x) return ...

  10. 使用Tensorflow对模型进行量化

    本文旨在将迁移学习训练好的模型基于tensorflow工具进行量化. 环境配置及迁移学习部分可参考博文[https://www.cnblogs.com/hayley111/p/12887853.htm ...