QT编程入门系列文章之二十六——反走样
今天继续前面的内容。既然已经进入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编程入门系列文章之二十六——反走样相关推荐
- GPS从入门到放弃(二十六) --- RTKLIB函数解析
GPS从入门到放弃(二十六) - RTKLIB函数解析 为了贴合这个系列的标题"从入门到放弃",在入门之后现在就要放弃此方向了.虽然感觉遗憾,暂时也没有办法.在此附上此系列最后一篇 ...
- Qt系列文章之二十五(使用QAudiolnput获取音频输入)
文章目录 前言 效果图 QAudioInput获取音频输入功能概述 程序主窗口定义与初始化 音频输入设备支持的格式 开始音频输入 流设备MineDisplayDevice的功能实现 源码获取 前言 ...
- Java编程入门100例之二十二(字符串查找)
字符串是各种编程语言中的最基础的数据类型,本文介绍字符串中一个常见的操作,如何检查字符串是否包含我们想要的东西. 代码如下: public class Test { public static voi ...
- TiDB 源码阅读系列文章(二十二)Hash Aggregation
2019独角兽企业重金招聘Python工程师标准>>> 作者:徐怀宇 聚合算法执行原理 在 SQL 中,聚合操作对一组值执行计算,并返回单个值.TiDB 实现了 2 种聚合算法:Ha ...
- SpringBoot入门建站全系列(二十六)Mongodb非关系型数据库的使用
SpringBoot入门建站全系列(二十六)Mongodb非关系型数据库的使用 一.概述 MongoDB 是一个基于分布式文件存储的数据库.由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能 ...
- Reflex WMS入门系列二十六:合并托盘
Reflex WMS入门系列二十六:合并托盘 仓库管理业务实践中,对于仓库里的库存,将几个零托合并成一个托,也是比较常见的作业.Reflex WMS系统自然要能支持这种合并托盘(Merge HDs)的 ...
- C++编程入门系列之十四(类与对象:构造函数和析构函数)
C++编程入门系列之十四(类与对象:构造函数和析构函数) 鸡啄米上一节中给大家讲解了类的声明.成员的访问控制和对象,今天鸡啄米给大家讲C++编程入门时同样必须掌握的构造函数和析构函数.从上一讲开始已经 ...
- (转)tensorflow入门教程(二十六)人脸识别(上)
https://blog.csdn.net/rookie_wei/article/details/81676177 1.概述 查看全文 http://www.taodudu.cc/news/show- ...
- javaSE从入门到精通的二十万字总结(一)
目录 前言 1. 面向对象 1.1 final关键字 1.2 抽象类 1.3 接口 1.4 接口与抽象类结合 1.5 接口的作用 1.6 包和import 1.7 访问控制权限 1.8 Object类 ...
- GPU 编程入门到精通(二)之 运行第一个程序
博主由于工作当中的需要,开始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GPU 编程,因此在这里特地学习一下 GPU 上面的编程.有志同道合的小伙伴 ...
最新文章
- php libdir,PHP扩展小结
- MySQL数据库聚合函数(count、max、min、sum、avg)
- ubuntu下 将证书导入java的cacerts证书库
- win系统下mysql忘记root账户密码的解决办法
- CodeForces - 1031B Curiosity Has No Limits(思维)
- jtextpane设置不能选中_在Bridge cc中不能使用camera raw 的编辑功能,解决方法
- 前端学习(2759):button按钮使用
- 深入理解 LINQ to SQL 生成的 SQL 语句
- java Statement与preparedStatement的区别
- SPSS基本操作与使用步骤【详细整理】
- mac系统pycharm配置python环境_Python--在Mac下安装PyQt5环境并配合pycharm(全部使用当前最新版)...
- php如何获取js中的内容_解析PHP中的Javascript提取
- 安装及创建python虚拟环境
- shell 截取文件名及扩展名
- java中ejb项目_创建EJB项目
- 魔兽世界拍卖行稳定服务器,魔兽世界TBC:大量玩家拍卖行卡到抓狂,分析其中可能的原因...
- WPA之一次第三方软件导致的白屏问题分析
- 一阶电路误差分析_自动控制(3)时域分析
- 上月和本月对比叫什么_统计学中与上个月比叫什么
- 2019年第十届蓝桥杯JAVAB组-----试题 J: 分考场