找回密码
 立即注册
收起左侧

第12篇 Qt5之2D绘图(二)渐变填充

4
回复
6137
查看
[复制链接]
累计签到:1564 天
连续签到:1 天
来源: 2017-3-28 01:46:07 显示全部楼层 |阅读模式
版权声明

该文章原创于Qt开源社区(www.qter.org),作者yafeilinux,转载请注明出处!


导语


前一篇中提到了在画刷中可以使用渐变填充。QGradient类就是用来和QBrush一起指定渐变填充的。Qt现在支持三种类型的渐变填充:
线性渐变(linear gradient)在开始点和结束点之间插入颜色;
辐射渐变(radial gradient)在焦点和环绕它的圆环间插入颜色;
锥形渐变(Conical)在圆心周围插入颜色。
这三种渐变分别由QGradient的三个子类来表示,QLinearGradient表示线性渐变,QRadialGradient表示辐射渐变,QConicalGradient表示锥形渐变。


环境:Windows 7 + Qt 5.8.0(包含QtCreator 4.2.1



目录

一、线性渐变
二、辐射渐变
三、锥形渐变

正文


一、线性渐变


1.我们仍然在上一篇创建的项目中进行讲解。更改paintEvent()函数如下:


void Widget::paintEvent(QPaintEvent *)
{
    //线性渐变
    QLinearGradient linearGradient(QPointF(40, 190),
                                   QPointF(70, 190));
    //插入颜色
    linearGradient.setColorAt(0, Qt::yellow);
    linearGradient.setColorAt(0.5, Qt::red);
    linearGradient.setColorAt(1, Qt::green);
    //指定渐变区域以外的区域的扩散方式
    linearGradient.setSpread(QGradient::RepeatSpread);
    //使用渐变作为画刷
    QPainter painter(this);
    painter.setBrush(linearGradient);
    painter.drawRect(100, 100, 90, 40);
}

       运行程序,效果如下图所示。




2.介绍

对于线性渐变QLinearGradient::QLinearGradient ( const QPointF & start, constQPointF & finalStop )需要指定开始点start和结束点finalStop,然后将开始点和结束点之间的区域进行等分,开始点的位置为0.0,结束点的位置为1.0,而它们之间的位置按照距离比例进行设定,然后使用QGradient::setColorAt( qreal position, const QColor & color )函数在指定的位置position插入指定的颜色color,当然,这里的position的值要在0到1之间。
       这里还可以使用setSpread()函数来设置填充的扩散方式,即指明在指定区域以外的区域怎样进行填充。扩散方式由QGradient::Spread枚举类型定义,它一共有三个值,分别是QGradient::PadSpread,使用最接近的颜色进行填充,这是默认值,如果我们不使用setSpread()指定扩散方式,那么就会默认使用这种方式;QGradient::RepeatSpread,在渐变区域以外的区域重复渐变;QGradient::ReflectSpread,在渐变区域以外将反射渐变。在线性渐变中这三种扩散方式的效果下图所示。要使用渐变填充,可以直接在setBrush()中使用,这时画刷风格会自动设置为相对应的渐变填充。



二、辐射渐变


1.继续在paintEvent()函数中添加如下代码:


//辐射渐变
QRadialGradient radialGradient(QPointF(100, 190),
                              50,QPointF(275,200));
radialGradient.setColorAt(0, QColor(255, 255, 100, 150));
radialGradient.setColorAt(1, QColor(0, 0, 0, 50));
painter.setBrush(radialGradient);
painter.drawEllipse(QPointF(100, 200), 50, 50);


运行程序,效果如下图所示。




2.介绍


       对于辐射渐变QRadialGradient::QRadialGradient( const QPointF & center, qreal radius, const QPointF & focalPoint )需要指定圆心center和半径radius,这样就确定了一个圆,然后再指定一个焦点focalPoint。焦点的位置为0,圆环的位置为1,然后在焦点和圆环间插入颜色。辐射渐变也可以使用setSpread()函数设置在渐变区域以外的区域的扩散方式,三种扩散方式的效果如下图所示。




三、锥形渐变


1.接着在paintEvent()函数里面添加如下代码:


//锥形渐变
QConicalGradient conicalGradient(
                    QPointF(250, 190), 60);
conicalGradient.setColorAt(0.2, Qt::cyan);
conicalGradient.setColorAt(0.9, Qt::black);
painter.setBrush(conicalGradient);
painter.drawEllipse(QPointF(250, 200), 50, 50);


运行程序,效果如下图所示。



2.介绍


对于锥形渐变QConicalGradient::QConicalGradient ( const QPointF & center,qreal angle )需要指定中心点center和一个角度angle(其值在0到360之间),然后沿逆时针从给定的角度开始环绕中心点插入颜色。这里给定的角度沿逆时针方向开始的位置为0,旋转一圈后为1。setSpread()函数对于锥形渐变没有效果。



结语


本节在前面的基础上,简单介绍了一下常用的三种渐变填充。如果大家可以熟练使用这几种填充效果,那么就可以实现非常漂亮的界面。另外,还可以给画笔设置渐变颜色,这样就可以绘制出特殊效果的线条和文字。


源码下载:


本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

累计签到:42 天
连续签到:1 天
2017-3-28 19:41:51 显示全部楼层
您什么时候会讲到Qchat呢?
回复 支持 反对

使用道具 举报

累计签到:1564 天
连续签到:1 天
2017-3-29 00:36:57 显示全部楼层
Qiang_Yan 发表于 2017-3-28 19:41
您什么时候会讲到Qchat呢?

需要把这个教程先更新完。
回复 支持 反对

使用道具 举报

累计签到:1 天
连续签到:1 天
2017-4-12 13:50:49 显示全部楼层
没法弄懂原理,有点尴尬了
回复 支持 反对

使用道具 举报

累计签到:14 天
连续签到:1 天
2019-2-27 15:08:45 显示全部楼层
本帖最后由 staticnull 于 2019-2-27 15:16 编辑

搞懂一个问题了!有用!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

公告
可以关注我们的微信公众号yafeilinux_friends获取最新动态,或者加入QQ会员群进行交流:190741849、186601429(已满) 我知道了