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);
    } 


            下来看看我们的画线的渐变效果吧!

     


  • 相关阅读:
    Selenium简单测试页面加载速度的性能(Page loading performance)
    Selenium Page object Pattern usage
    Selenium如何支持测试Windows application
    UI Automation的两个成熟的框架(QTP 和Selenium)
    分享自己针对Automation做的两个成熟的框架(QTP 和Selenium)
    敏捷开发中的测试金字塔(转)
    Selenium 的基础框架类
    selenium2 run in Jenkins GUI testing not visible or browser not open but run in background浏览器后台运行不可见
    eclipse与SVN 结合(删除SVN中已经上传的问题)
    配置Jenkins的slave节点的详细步骤适合windows等其他平台
  • 原文地址:https://www.cnblogs.com/javawebsoa/p/3074095.html
Copyright © 2011-2022 走看看