QPainter实现流光虚线

2 篇文章 0 订阅

1、功能描述

通过QPinter绘制虚线,并在虚线上实现流光效果。

2、效果图

3、实现思路 

(1)在QLinearGradient上构建色带填充QImage,实现一个颜色表以供查询;


void SteamerLine::CreateColorTable()
{
    //颜色表,先绘制到img,再根据坐标取颜色值,可根据需求更改颜色及范围
    QLinearGradient Gradient(QPointF(0,0),QPointF(0,100));
    Gradient.setColorAt(0,Qt::red);
    Gradient.setColorAt(0.333,Qt::green);
    Gradient.setColorAt(0.5,Qt::blue);
    Gradient.setColorAt(1,Qt::red);

    Img = QImage(1,100,QImage::Format_ARGB32);
    QPainter imgp(&Img);
    imgp.fillRect(Img.rect(),Gradient);
}

(2)采用定时器,定时刷新色带,让查询到的颜色具有流动效果;

 //设置定时器更新颜色
    QTimer *timer =new QTimer(this);
    connect(timer,&QTimer::timeout,this,[this]{
        offset++;
        offset %= 100;
        update();
    });
    timer->start(50);

(3)求直线与X轴夹角,方便求取线段上的点;

    //求直线与X轴夹角,方便求取线段上的点
    double theta;
    theta = atan2(EndPos.y()-StartPos.y(), EndPos.x()-StartPos.x());
    theta = theta * 180 / M_PI;

(4)在一个实部内,根据分片长度获取两端的坐标,从颜色表取对应的颜色值,根据两端颜色设置渐变,然后填充该段采样。

//设置起点下一个线段的起点
        double newx1 = StartPos.x() + j* len * cos(theta);
        double newy1 = StartPos.y() + j* len * sin(theta);
        pt1.setX(newx1);
        pt1.setY(newy1);
        for(int i=0; i < Dashelen; i+=step)
        {
            //根据采样长度获取两端的坐标
            double x2 = pt1.x() + step * cos(theta);
            double y2 = pt1.y() + step * sin(theta);
            pt2.setX(x2);
            pt2.setY(y2);

            //从颜色表取对应的颜色值
            QColor color1=Img.pixelColor(0,(i/step+offset)%100);
            QColor color2=Img.pixelColor(0,((i+step)/step+offset)%100);
            QLinearGradient lg(pt1,pt2);
            lg.setColorAt(0,color1);
            lg.setColorAt(1,color2);

            //根据两端颜色设置渐变,然后填充该段采样
            pen.setBrush(lg);
            p.setPen(pen);
            p.drawLine(pt1,pt2);

            //下一次绘制起点
            pt1 = pt2;
        }

(5)获取每个实部起始点,反复(4)步骤得到流光效果虚线。

 //单条虚线和空格的长度
    double len = SpaceLen+Dashelen;
    QLineF line(StartPos,EndPos);
    //根据总长度计算总共要绘制多少个虚线段
    int count = line.length() / len;
    //没一个step重新查找绘制一个颜色
    int step = 1;

    QPointF pt1 = StartPos;
    QPointF pt2 = pt1;
    for(int j = 0; j < count;j++)
    {
        //设置起点下一个线段的起点
        double newx1 = StartPos.x() + j* len * cos(theta);
        double newy1 = StartPos.y() + j* len * sin(theta);
        pt1.setX(newx1);
        pt1.setY(newy1);
        for(int i=0; i < Dashelen; i+=step)
        {
            //根据采样长度获取两端的坐标
            double x2 = pt1.x() + step * cos(theta);
            double y2 = pt1.y() + step * sin(theta);
            pt2.setX(x2);
            pt2.setY(y2);

            //从颜色表取对应的颜色值
            QColor color1=Img.pixelColor(0,(i/step+offset)%100);
            QColor color2=Img.pixelColor(0,((i+step)/step+offset)%100);
            QLinearGradient lg(pt1,pt2);
            lg.setColorAt(0,color1);
            lg.setColorAt(1,color2);

            //根据两端颜色设置渐变,然后填充该段采样
            pen.setBrush(lg);
            p.setPen(pen);
            p.drawLine(pt1,pt2);

            //下一次绘制起点
            pt1 = pt2;
        }
      }

源代码地址:QPainter实现流光虚线-C++文档类资源-CSDN下载

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值