注:学习自《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. 04 . Jenkins定制主题和设置项目构建信息输出颜色

    Jenkins thems自动生成定制主题css Jenkins默认界面比较丑,视觉容易疲劳,这时候就需要我们更换一个主题,让我们的Jenkins美观一些. 以下是css主题的地址 http://af ...

  2. OO第四单元——终章

    一.架构设计 这一单元的作业主要是围绕UML来对我们的面向对象思维进行训练,刚开始接触的时候或许因为些许陌生而觉得有一定难度,但随着一次一次的代码阅读再加上思考,逐渐地也变得得心应手了起来. 1.第一 ...

  3. Spring boot+Mybatisplus用AR模式实现逻辑删除操作

    Mybatisplus的AR模式 Active Record(活动记录),是一种领域模型模式,特点是一个模型类对应关系型数据库中的一个表,而模型类的一个实例对应表中的一行记录.ActiveRecord ...

  4. 谷歌Chrome成最受欢迎的浏览器 它为啥好用?

    毫无疑问,在搜索引擎领域,谷歌是绝对的主导者.但是,一般人却很容易低估我们受到的“控制”.比如,它的浏览器Chrome. 在不到九年的时间,谷歌Chrome浏览器已经成为全球使用最多的网页浏览器.目前 ...

  5. Python数据结构01 线性结构

    栈 实现 后进先出的结构,主要有如下操作 *Stack() *push(item) *pop() *peek() *isEmpty() *size() class Stack(): def __ini ...

  6. 分词搜索 sphinx+php+mysql

    sphinx3.1.1的安装与使用 下载sphinx3.1.1 wget http://sphinxsearch.com/files/sphinx-3.1.1-612d99f-linux-amd64. ...

  7. 暑假集训日记Day xx

    Day 1 6.23 今天算是第一天吧 (毕竟昨天被迫做了半天苦力) 充实而丰满的一天:上午做题 下午讲题 晚上改错(考试是原题和我会做有什么关系吗) 早起跑操还阔以(比之前距离短就很快乐) 然后练了 ...

  8. MFC文档视图中窗口切换 (2012-05-11 18:32:48)

    在文档试图应用程序,有时需要在工作区切换试图,以下就是如何切换试图了 .创建要切换的视图类,同时把构造函数,Create函数改变为public .在需要切换试图的动作响应中,加入切换代码,一般是在CM ...

  9. 字符串String和list集合判空验证

    1`字符串判断处理: 结论: 当if判断条件为两个,并且它们两个为或的关系,如果第一个条件为false,则继续第二个条件的判断:如果第一个条件为true,该例子不足以说明是否判断第二个条件, 最终可以 ...

  10. 洛谷 P1025 【数的划分】

    进入正题 思路:递归 这道题有点像放苹果: 把M个同样的苹果放在N个同样的盘子里,允许有的盘子空着不放,问共有多少种不同的分发(5,1,1和1,1,5是同一种方法) 转化一下就有: 把n个苹果放在k个 ...