1. 程式人生 > >QT之GUI學習筆記(二十)---反走樣

QT之GUI學習筆記(二十)---反走樣

反走樣是圖形學中的重要概念,用以防止“鋸齒”現象的出現。很多系統包括Qt的繪圖API裡面都會內建了反走樣演算法,預設是關閉的。

一 程式碼

  1. 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)在一些必須精確操作畫素的應用中,也是不能進行反走樣的