zoukankan      html  css  js  c++  java
  • Qt学习:QPainter之反走样

            反走样是图形学中的重要概念,用以防止“锯齿”现象的出现。很多系统的绘图API里面都会内置了反走样的算法,不过默认一般都是关闭的,Qt也不例外。这里依然先给出效果图先

     

             其中左图是第一条直线是未启用反走样的效果,第二条直线启用了反走样;右上边一幅图像时启用了反走样的效果,右下边的图关闭了反走样。可以看出,两者的区别还是相当大的。
            下面对一些函数及其参数做一点说明:

    painter.setPen(QPen(Qt::black, 3, Qt::DashDotLine, Qt::RoundCap));
    

             我们对照着API去看,第一个参数是画笔颜色,这里设置为黑色;第二个参数是画笔的宽度,以像素为单位,这里是5px;第三个是画笔样式,我们使用了DashDotLine,正如同其名字所示,是一个短线和一个点相间的类型;第四个是RoundCap,也就是圆形笔帽。

    painter.setBrush(QBrush(Qt::green, Qt::Dense1Pattern));
    


            然后我们使用一个绿色的画刷填充,画了一个椭圆。 

            下面介绍反走样函数:

    painter.setRenderHint(QPainter::Antialiasing, true);
    


            这里设置Antialiasing属性为true,如果你学过图形学就会知道,这个长长的单词就是“反走样”。经过这句设置,我们就打开了QPainter的反走样功能。QPainter和OpenGL一样,是一个状态机,因此,只要这里我们打开了它,之后所有的代码都会是反走样绘制的了。若要关闭反走样功能:

    painter.setRenderHint(QPainter::Antialiasing, false);
    


            看到这里你会发现,反走样的效果其实比不走样要好得多,那么,为什么不默认打开反走样呢?这是因为,反走样是一种比较复杂的算法,在一些对图像质量要求不高的应用中,是不需要进行反走样的。为了提高效率,一般的图形绘制系统,如Java2D、OpenGL之类都是默认不进行反走样的。

    以下是代码:

    //painter.h
    #ifndef MYWIDGET_H
    #define MYWIDGET_H
    
    #include <QWidget>
    
    class MyWidget : public QWidget
    {
     Q_OBJECT
     
    public:
     MyWidget(QWidget *parent = 0);
     
    protected:
     void paintEvent(QPaintEvent *event);
     
    };
    
    #endif
    


     

    //painter.cpp
    #include <QtGui>
    
    #include "painter.h"
    
    MyWidget::MyWidget(QWidget *parent)
     :QWidget(parent)
    {
     setFixedSize(250, 320);
     setWindowTitle(tr("Painter Demo"));
    }
    
    void MyWidget::paintEvent(QPaintEvent *event)
    {
     QPainter painter(this);
     
     painter.setPen(Qt::blue);
     painter.drawLine(20, 77, 23, 250);
     
     painter.setRenderHint(QPainter::Antialiasing, true);
     painter.setPen(Qt::red);
     painter.drawLine(30, 77, 33, 250);
     
     painter.setPen(QPen(Qt::black, 3, Qt::DashDotLine, Qt::RoundCap));
     painter.setBrush(QBrush(Qt::green, Qt::Dense1Pattern));
     painter.drawEllipse(50, 20, 150, 80);
     
     painter.setRenderHint(QPainter::Antialiasing, false);
     painter.setPen(QPen(Qt::black, 3, Qt::DashDotLine, Qt::RoundCap));
     painter.setBrush(QBrush(Qt::green, Qt::Dense1Pattern));
     painter.drawEllipse(50, 200, 150, 80);
    }
    


     

    //main.cpp
    #include <QApplication>
    
    #include "painter.h"
    
    int main(int argc, char **argv)
    {
     QApplication app(argc,argv);
     MyWidget w;
     w.show();
     return app.exec();
    } 





     

     

     

  • 相关阅读:
    LeetCode5654. 盒子中小球的最大数量
    LeetCode40. 组合总和 II
    LeetCode39. 组合总和
    LeetCode17. 电话号码的字母组合
    Leetcode216. 组合总和 III
    eclipse相关使用
    matlab符号的含义
    matlab矩阵相关的笔记
    vi编辑器
    Linux 环境变量
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3069845.html
Copyright © 2011-2022 走看看