zoukankan      html  css  js  c++  java
  • 渐变颜色Qt学习:QPainter之渐变填充

    今天一直在研究渐变颜色之类的问题,下午正好有机会和大家分享一下.

            后面说了有关反走样的相干知识,下面来讲一下渐变。渐变是绘图中很罕见的一种功能,它是利用颜色插值使得两个或更多颜色之间能够平滑过渡,简单来讲就是可以把几种颜色混合在一起,让它们能够自然地过渡,而不是一下子酿成另一种颜色。它们常被用来创立二维图形的三维效果。渐变的算法比较复杂,写得欠好的话效率会很低,好在很多绘图系统都内置了渐变的功能,Qt也不例外。渐变一般是用在填充里面的,所以,渐变的设置就是在QBrush里面。
            Qt支持三种类型的渐变,分别是线性渐变(QLinearGradient)、辐射渐变(QRadialGradient)、锥形渐变(QConicalGradient)。

            1、线性渐变由两个控制点定义,连接这两点的线上设置一系列的颜色断点。这些断点被钳位到浮点数0和1之间,0对应第一个控制点,1对应第二个控制点,两个指定断点之间的颜色由线性插值得出。如代码(以下给出paintEvent()函数里面的代码):

    void MyWidget::paintEvent(QPaintEvent *event)
    {
     QPainter painter(this);
     painter.setRenderHint(QPainter::Antialiasing, true);
    
     QLinearGradient linearGradient(60, 50, 200, 200); 
     linearGradient.setColorAt(0.2, Qt::white); 
     linearGradient.setColorAt(0.6, Qt::green); 
     linearGradient.setColorAt(1.0, Qt::black); 
     painter.setBrush(QBrush(linearGradient)); 
     painter.drawEllipse(50, 50, 200, 150);
    }

            这里0对应第一个控制点(60,50),1对应第二个控制点(200,200),之间用了三个颜色插值,效果如下图:

        渐变和颜色

        

     

      

        2、辐射渐变由一个中心点、半径、一个核心,以及颜色断点控制。中心点和半径定义一个圆。颜色从核心向外扩散,核心可所以中心点或者圆内的其他点。代码如下:

    void MyWidget::paintEvent(QPaintEvent *event)
    {
     QPainter painter(this);
     painter.setRenderHint(QPainter::Antialiasing, true);
     
     QRadialGradient radialGradient(130, 130, 100, 130, 130);
     radialGradient.setColorAt(0.0, Qt::white);
     radialGradient.setColorAt(0.6, Qt::black);
     radialGradient.setColorAt(0.8, Qt::green);
     painter.setBrush(QBrush(radialGradient));
     painter.drawEllipse(50, 50, 200, 150);
    }
        每日一道理
    有些冷,有些凉,心中有些无奈,我一个人走在黑夜中,有些颤抖,身体瑟缩着,新也在抖动着,我看不清前方的路,何去何从,感觉迷茫,胸口有些闷,我环视了一下周围,无人的街头显得冷清,感到整个世界都要将我放弃。脚步彷徨之间,泪早已滴下……

        
            这里QRadialGradient radialGradient(130, 130, 100, 130, 130);中前两个参数指定了中心点,第三个参数指定了半径,后两个参数指定了核心,这里中心点和核心是同一个点,所以看起来效果是从中心点向外平均扩散。效果如下:

        渐变和颜色

        

     

                3、锥形渐变由一个中心点和一个角度定义,颜色从x轴正向偏转一个角度开始,按给定颜色断点旋转扩散。代码如下:

    void MyWidget::paintEvent(QPaintEvent *event)
    {
     QPainter painter(this);
     painter.setRenderHint(QPainter::Antialiasing, true);
     
     QConicalGradient conicalGradient(150,150, 90);
     conicalGradient.setColorAt(0.2, Qt::white);
     conicalGradient.setColorAt(0.6, Qt::green);
     conicalGradient.setColorAt(0.8, Qt::black);
     painter.setBrush(QBrush(conicalGradient));
     painter.drawEllipse(50, 50, 200, 150);
    }

                这里定义(150,150)为中心点,从x轴正向开始偏转90度,然后按白绿黑旋转扩撒,效果如下:

        渐变和颜色

        

     

                4、那么我们如何控制我们的线条也是渐变效果呢 ? 通常我们画线是用画笔来完成的,但是QPen是接收QBrush做参数的,也就是说,你可以利用一个QBrush创立一个QPen,这样,QBrush所有的填充效果都可以用在画笔上了!代码如下:

         

    void MyWidget::paintEvent(QPaintEvent *event)
    {
     QPainter painter(this);
     painter.setRenderHint(QPainter::Antialiasing, true);
     
     QLinearGradient linearGradient(60, 50, 200, 200); 
     linearGradient.setColorAt(0.2, Qt::white); 
     linearGradient.setColorAt(0.6, Qt::green); 
     linearGradient.setColorAt(1.0, Qt::black); 
     painter.setPen(QPen(QBrush(linearGradient),5)); 
     painter.drawEllipse(50, 50, 200, 150);
    }

        
            上去看看我们的画线的渐变效果吧!

        渐变和颜色

        

     

        

    文章结束给大家分享下程序员的一些笑话语录: 一位程序员去海边游泳,由于水性不佳,游不回岸了,于是他挥着手臂,大声求.救:“F1,F1!”

  • 相关阅读:
    第4章 Android移植环境搭建
    第3章 Android移植平台工具介绍
    第2章
    第1章 Android系统的编译和移植实例:
    nfs
    TFTP服务器搭建
    根系统制作
    nfs挂载
    uboot的编译
    交叉工具链的搭建方法
  • 原文地址:https://www.cnblogs.com/jiangu66/p/3074836.html
Copyright © 2011-2022 走看看