今天继续前面的内容。既然已经进入2D绘图部分,那么就先继续研究一下有关QPainter的东西吧!

反走样是图形学 中的重要概念,用以防止“锯齿”现象的出现。很多系统的绘图API里面都会内置了反走样的算法,不过默认一般都是关闭的,Qt也不例外。下面我们来看看代码。这段代码仅仅给出了paintEvent函数,相信你可以很轻松地替换掉前面章节中的相关代码。

void  PaintedWidget::paintEvent(QPaintEvent *event)

{

QPainter  painter(this);

painter.setPen(QPen(Qt::black,  5,   Qt::DashDotLine, Qt::RoundCap));

painter.setBrush(Qt::yellow);

painter.drawEllipse(50, 150,  200, 150);

painter.setRenderHint(QPainter::Antialiasing,  true);

painter.setPen(QPen(Qt::black,  5,  Qt::DashDotLine, Qt::RoundCap));

painter.setBrush(Qt::yellow);

painter.drawEllipse(300, 150, 200, 150);

}

看看运行后的效果:


  左边的是没有使用反走样技术的,右边是使用了反走样技术的。二者的差别可 以很容易的看出来。

下面来看看相关的代码。为了尝试画笔的样式,这里故意使用了一个新的画笔:

painter.setPen(QPen(Qt::black,  5, Qt::DashDotLine, Qt::RoundCap));

我们对照着API去看,第一个参数是画笔颜 色,这里设置为黑色;第二个参数是画笔的粗细,这里是5px;第三个是画笔样式,我们使用了 DashDotLine,正如同其名字所示,是一个短线和一个点相间的类型;第四个是RoundCap,也就是圆形笔帽。然后我们使用一个黄色的画刷填 充,画了一个椭圆。

后面的一个和前面的十分相似,唯一的区别是多了一句

painter.setRenderHint(QPainter::Antialiasing,  true);

不过这句也很清楚,就是设置Antialiasing属性为true。如果你学过图形学就会知道,这个长 长的单词就是“反走样”。经过这句设置,我们就打开了QPainter的反走样功能。还记得我们曾经说过,QPainter是一个状态机,因此,只要这里 我们打开了它,之后所有的代码都会是反走样绘制的了。

看到这里你会发现,反走样的效果其实比不走样要好得多,那么,为什么不默认打开反走样呢?这是因为,反走样是一种比较复杂的算法,在一些对图像质量要求不高的应用中,是不需要进行反走样的。为了提高效率,一般的图形绘制系统,如 Java2D、OpenGL之类都是默认不进行反走样的。

还有一个疑问,既然反走样比不反走样的图像质量高很多,不进行反走样的绘制还 有什么作用呢?前面说的是一个方面,也就是,在一些对图像质量要求不高的环境下,或者说性能受限的环境下,比如嵌入式和手机环境,是不必须要进行反走样 的。另外还有一点,在一些必须精确操作像素的应用中,也是不能进行反走样的。请看下面的图片:


  上图是使用Photoshop的铅笔和画笔工具画的1像素的点在放大到 3200%视图下截下来的。Photoshop里面的铅笔工具是不进行反走样,而画笔是要进行反走样的。在放大的情况下就会知道,有反走样的情况下是不能 进行精确到1像素的操作的。因为反走样很难让你控制到1个像素。这不是 Photoshop画笔工具的缺陷,而是反走样算法的问题。如果你想了解为什么这样,请查阅计算机图形学里面关于反走样的原理部分。

QT编程入门系列文章之二十六——反走样相关推荐

  1. GPS从入门到放弃(二十六) --- RTKLIB函数解析

    GPS从入门到放弃(二十六) - RTKLIB函数解析 为了贴合这个系列的标题"从入门到放弃",在入门之后现在就要放弃此方向了.虽然感觉遗憾,暂时也没有办法.在此附上此系列最后一篇 ...

  2. Qt系列文章之二十五(使用QAudiolnput获取音频输入)

    文章目录 前言 效果图 QAudioInput获取音频输入功能概述 程序主窗口定义与初始化 音频输入设备支持的格式 开始音频输入 流设备MineDisplayDevice的功能实现 源码获取 前言   ...

  3. Java编程入门100例之二十二(字符串查找)

    字符串是各种编程语言中的最基础的数据类型,本文介绍字符串中一个常见的操作,如何检查字符串是否包含我们想要的东西. 代码如下: public class Test { public static voi ...

  4. TiDB 源码阅读系列文章(二十二)Hash Aggregation

    2019独角兽企业重金招聘Python工程师标准>>> 作者:徐怀宇 聚合算法执行原理 在 SQL 中,聚合操作对一组值执行计算,并返回单个值.TiDB 实现了 2 种聚合算法:Ha ...

  5. SpringBoot入门建站全系列(二十六)Mongodb非关系型数据库的使用

    SpringBoot入门建站全系列(二十六)Mongodb非关系型数据库的使用 一.概述 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能 ...

  6. Reflex WMS入门系列二十六:合并托盘

    Reflex WMS入门系列二十六:合并托盘 仓库管理业务实践中,对于仓库里的库存,将几个零托合并成一个托,也是比较常见的作业.Reflex WMS系统自然要能支持这种合并托盘(Merge HDs)的 ...

  7. C++编程入门系列之十四(类与对象:构造函数和析构函数)

    C++编程入门系列之十四(类与对象:构造函数和析构函数) 鸡啄米上一节中给大家讲解了类的声明.成员的访问控制和对象,今天鸡啄米给大家讲C++编程入门时同样必须掌握的构造函数和析构函数.从上一讲开始已经 ...

  8. (转)tensorflow入门教程(二十六)人脸识别(上)

    https://blog.csdn.net/rookie_wei/article/details/81676177 1.概述 查看全文 http://www.taodudu.cc/news/show- ...

  9. javaSE从入门到精通的二十万字总结(一)

    目录 前言 1. 面向对象 1.1 final关键字 1.2 抽象类 1.3 接口 1.4 接口与抽象类结合 1.5 接口的作用 1.6 包和import 1.7 访问控制权限 1.8 Object类 ...

  10. GPU 编程入门到精通(二)之 运行第一个程序

    博主由于工作当中的需要,开始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GPU 编程,因此在这里特地学习一下 GPU 上面的编程.有志同道合的小伙伴 ...

最新文章

  1. php libdir,PHP扩展小结
  2. MySQL数据库聚合函数(count、max、min、sum、avg)
  3. ubuntu下 将证书导入java的cacerts证书库
  4. win系统下mysql忘记root账户密码的解决办法
  5. CodeForces - 1031B Curiosity Has No Limits(思维)
  6. jtextpane设置不能选中_在Bridge cc中不能使用camera raw 的编辑功能,解决方法
  7. 前端学习(2759):button按钮使用
  8. 深入理解 LINQ to SQL 生成的 SQL 语句
  9. java Statement与preparedStatement的区别
  10. SPSS基本操作与使用步骤【详细整理】
  11. mac系统pycharm配置python环境_Python--在Mac下安装PyQt5环境并配合pycharm(全部使用当前最新版)...
  12. php如何获取js中的内容_解析PHP中的Javascript提取
  13. 安装及创建python虚拟环境
  14. shell 截取文件名及扩展名
  15. java中ejb项目_创建EJB项目
  16. 魔兽世界拍卖行稳定服务器,魔兽世界TBC:大量玩家拍卖行卡到抓狂,分析其中可能的原因...
  17. WPA之一次第三方软件导致的白屏问题分析
  18. 一阶电路误差分析_自动控制(3)时域分析
  19. 上月和本月对比叫什么_统计学中与上个月比叫什么
  20. 2019年第十届蓝桥杯JAVAB组-----试题 J: 分考场

热门文章

  1. 方舟服务器怎么去地牢拿芯片,方舟生存进化怎么拿芯片
  2. 测量脉冲调制信号的绝对和加性相位噪声
  3. 【小工具】文件夹映射为本地磁盘(重启不失效)
  4. 前端组件库自定义主题切换探索-02-webpack-theme-color-replacer webpack 的实现逻辑和原理-01
  5. RN如何使用原生的AndroidUI组件
  6. 如何免费注册一个域名?
  7. C# 破解 Reflector8.5
  8. Kademlia详解 (转贴NeoRagex2002)
  9. 饥荒控制台输入没用_饥荒联机版代码为什么没效 怎么用怎么输入
  10. vue实现li列表的新增删除和修改