Qt学习之路(26): 反走样

简介:
今天继续前面的内容。既然已经进入2D绘图部分,那么就先继续研究一下有关QPainter的东西吧!
 
反走样是图形学中的重要概念,用以防止“锯齿”现象的出现。很多系统的绘图API里面都会内置了反走样的算法,不过默认一般都是关闭的,Qt也不例外。下面我们来看看代码。这段代码仅仅给出了paintEvent函数,相信你可以很轻松地替换掉前面章节中的相关代码。
 
InBlock.gif void PaintedWidget::paintEvent(QPaintEvent * event
InBlock.gif
InBlock.gif        QPainter painter( this); 
InBlock.gif        painter.setPen(QPen(Qt::black, 5, Qt::DashDotLine, Qt::RoundCap)); 
InBlock.gif        painter.setBrush(Qt::yellow); 
InBlock.gif        painter.drawEllipse(50, 150, 200, 150); 
InBlock.gif 
InBlock.gif        painter.setRenderHint(QPainter::Antialiasing,  true); 
InBlock.gif        painter.setPen(QPen(Qt::black, 5, Qt::DashDotLine, Qt::RoundCap)); 
InBlock.gif        painter.setBrush(Qt::yellow); 
InBlock.gif        painter.drawEllipse(300, 150, 200, 150); 
InBlock.gif}
 
看看运行后的效果:
 
 
左边的是没有使用反走样技术的,右边是使用了反走样技术的。二者的差别可以很容易的看出来。
 
下面来看看相关的代码。为了尝试画笔的样式,这里故意使用了一个新的画笔:
 
InBlock.gifpainter.setPen(QPen(Qt::black, 5, Qt::DashDotLine, Qt::RoundCap));
 
我们对照着API去看,第一个参数是画笔颜色,这里设置为黑色;第二个参数是画笔的粗细,这里是5px;第三个是画笔样式,我们使用了DashDotLine,正如同其名字所示,是一个短线和一个点相间的类型;第四个是RoundCap,也就是圆形笔帽。然后我们使用一个黄色的画刷填充,画了一个椭圆。
 
后面的一个和前面的十分相似,唯一的区别是多了一句
 
InBlock.gifpainter.setRenderHint(QPainter::Antialiasing,  true);
 
,不过这句也很清楚,就是设置Antialiasing属性为true。如果你学过图形学就会知道,这个长长的单词就是“反走样”。经过这句设置,我们就打开了QPainter的反走样功能。还记得我们曾经说过,QPainter是一个状态机,因此,只要这里我们打开了它,之后所有的代码都会是反走样绘制的了。
 
看到这里你会发现,反走样的效果其实比不走样要好得多,那么,为什么不默认打开反走样呢?这是因为,反走样是一种比较复杂的算法,在一些对图像质量要求不高的应用中,是不需要进行反走样的。为了提高效率,一般的图形绘制系统,如Java2D、OpenGL之类都是默认不进行反走样的。
 
还有一个疑问,既然反走样比不反走样的图像质量高很多,不进行反走样的绘制还有什么作用呢?前面说的是一个方面,也就是,在一些对图像质量要求不高的环境下,或者说性能受限的环境下,比如嵌入式和手机环境,是不必须要进行反走样的。另外还有一点,在一些必须精确操作像素的应用中,也是不能进行反走样的。请看下面的图片:
 
上图是使用Photoshop的铅笔和画笔工具画的1像素的点在放大到3200%视图下截下来的。Photoshop里面的铅笔工具是不进行反走样,而画笔是要进行反走样的。在放大的情况下就会知道,有反走样的情况下是不能进行精确到1像素的操作的。因为反走样很难让你控制到1个像素。这不是Photoshop画笔工具的缺陷,而是反走样算法的问题。如果你想了解为什么这样,请查阅计算机图形学里面关于反走样的原理部分。

本文转自 FinderCheng 51CTO博客,原文链接:
http://blog.51cto.com/devbean/237447


相关文章
|
2月前
|
数据挖掘 C++
QT基础入门——项目案例(七)
QT基础入门——项目案例(七)
96 0
QT基础入门——项目案例(七)
|
4月前
|
自然语言处理 数据可视化 UED
QT基础教学(窗口组件)
QT基础教学(窗口组件)
40 0
|
4月前
QT入门基础(二)
QT入门基础(二)
|
4月前
|
Linux API 调度
QT入门基础(一)
QT入门基础(一)
|
5月前
《QT从基础到进阶·八》QDockWidget使用
《QT从基础到进阶·八》QDockWidget使用
51 0
|
8月前
|
编解码 开发框架 Linux
Qt入门学习
学习Qt并使用Qt
203 0
Qt入门学习
|
开发框架 Ubuntu 编译器
学习Qt之基础篇——从入门开始(1)
Qt 简介 Qt是一个跨平台的C++应用程序开发框架,被广泛用于开发GUI程序。 Qt有丰富的 API且面向对象。Qt是自由且开放源代码的软件,在GNU较宽松公共许可证条款下发布。支持广泛的编译器,包括GCC的C++编译器和Visual Studio。
196 0
学习Qt之基础篇——从入门开始(1)
Qt BarChart实践
按照帮助文档编写
94 0
Qt BarChart实践

推荐镜像

更多