原文地址:http://devbean.blog.51cto.com/448512/237447
反走样是图形学中的重要概念,用以防止“锯齿”现象的出现。很多系统包括Qt的绘图API里面都会内置了反走样算法,默认是关闭的。
一 代码
- paintedwidget.cpp中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);
}
2.运行结果
第一个为没有设置反走样的图形;
第二个为设置反走样的图形;
两个可以看出有明显的区别
二 代码解析
1.Qpen
painter.setPen(QPen(Qt::black, 5, Qt::DashDotLine, Qt::RoundCap));
(1)Qpen的构造函数如下:
QPen::QPen(const QColor &color)
QPen::QPen(const QColor &color)
QPen::QPen(const QBrush &brush, qreal width, Qt::PenStyle style = Qt::SolidLine, Qt::PenCapStyle cap = Qt::SquareCap, Qt::PenJoinStyle join = Qt::BevelJoin)
在这段代码中
QPen(Qt::black, 5, Qt::DashDotLine, Qt::RoundCap)
使用的是第三个构造函数
(2)setPen()函数
void QPainter::setPen(const QPen &pen)
void QPainter::setPen(const QColor &color)
void QPainter::setPen(Qt::PenStyle style)
上面的代码片段使用的是第一个函数。
3.
painter.setRenderHint(QPainter::Antialiasing, true);
这段代码意思:Antialiasing功能打开
即 反走样功能打开
由于QPainter是一个状态机,因而以后的状态都为防走样状态。
4.默认不打开反走样的原因
(1)反走样是一种比较复杂的算法,在一些对图像质量要求不高的应用中,是不需要进行反走样的。为了提高效率,一般的图形绘制系统,如Java2D、OpenGL之类都是默认不进行反走样的。
(2)在一些必须精确操作像素的应用中,也是不能进行反走样的