副标题#e#
本日继承前面的内容。既然已经进入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);
#p#副标题#e#
不外这句也很清楚,就是配置Antialiasing属性为true。假如你学过图形学就会知道,这个长长的单词就是“反走样”。颠末这句配置,我们就打开了QPainter的反走样成果。还记得我们曾经说过,QPainter是一个状态机,因此,只要这里我们打开了它,之后所有的代码城市是反走样绘制的了。
看到这里你会发明,反走样的结果其实比不走样要好得多,那么,为什么不默认打开反走样呢?这是因为,反走样是一种较量巨大的算法,在一些对图像质量要求不高的应用中,是不需要举办反走样的。为了提高效率,一般的图形绘制系统,如Java2D、OpenGL之类都是默认不举办反走样的。
尚有一个疑问,既然反走样比不反走样的图像质量高许多,不举办反走样的绘制尚有什么浸染呢?前面说的是一个方面,也就是,在一些对图像质量要求不高的情况下,可能说机能受限的情况下,好比嵌入式和手机情况,是不必需要举办反走样的。别的尚有一点,在一些必需准确操纵像素的应用中,也是不能举办反走样的。请看下面的图片:
上图是利用Photoshop的铅笔和画笔东西画的1像素的点在放大到3200%视图下截下来的。Photoshop内里的铅笔东西是不举办反走样,而画笔是要举办反走样的。在放大的环境下就会知道,有反走样的环境下是不能举办准确到1像素的操纵的。因为反走样很难让你节制到1个像素。这不是 Photoshop画笔东西的缺陷,而是反走样算法的问题。假如你想相识为什么这样,请查阅计较机图形学内里关于反走样的道理部门。
出处:http://devbean.blog.51cto.com/448512/237447