QPainter实现流光虚线

这篇具有很好参考价值的文章主要介绍了QPainter实现流光虚线。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

1、功能描述

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

2、效果图

qt绘制虚线,C++,Qt,qt,ui,开发语言

qt绘制虚线,C++,Qt,qt,ui,开发语言

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下载文章来源地址https://www.toymoban.com/news/detail-743806.html

到了这里,关于QPainter实现流光虚线的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Qt之QPainter绘制多个矩形/圆形(含源码+注释)

    下图绘制的是矩形对象,但是将绘制矩形函数(drawRect)更改为绘制圆形(drawEllipse)即可绘制圆形。 绘制矩形需要自然要获取矩形数据,因此通过鼠标事件获取每个矩形的rect数据(鼠标按下为起始点,鼠标释放为结束点;每次移动时的当前位置做结束点,并实时刷新,实现

    2023年04月25日
    浏览(120)
  • Qt关于QPainter绘制1px宽度图形带来的问题思考

    前段时间遇到这样一个问题,使用QPainter绘制直线的时候,设置了笔宽为1像素,但是绘制出来的线条却是2px宽度,而且设置的画笔颜色很明显是降低了透明度,不是最“纯正”的颜色。 当时就感觉非常奇怪,明明设置的画笔宽度是正常的,为啥绘制出来不是自己想要的样子。

    2023年04月20日
    浏览(41)
  • 《QT从基础到进阶·十五》用鼠标绘制矩形(QGraphicsView、QPainter、QGraphicsRectItem)

    以下是鼠标绘制矩形最全的一种用法,完整源码将会放在最后面。 QT版本:5.15.2 VS版本:2019 1、在界面加载一张图片 界面的搭建选用QGraphicsView,自定义类GraphicsView继承QGraphicsView,在主程序中点击按钮打开 图片,相关代码如下: 2、创建矩形绘制对象,并绘制、移动矩形 在

    2024年02月04日
    浏览(51)
  • 【嵌入式Qt开发入门】如何使用Qt进行绘图——QPainter 绘图

            绘图与图表在嵌入式里有的比较多,尤其是图表,我们常在股票里看到的“图表折线/曲线 图/饼状图等”都可以用 Qt 的图表来实现。绘图和图表的内容本章主要介绍绘图和图表的基本操作,以简单的例子呈现绘图与图表的用法,目的就是快速入门绘图与图表,关

    2024年02月12日
    浏览(48)
  • qt QPainter 实现图片的缩放和平移

    头文件 CPP lable 不是必要的,设置好关键的2个值最重要

    2024年02月16日
    浏览(38)
  • QT窗体绘图QPainter

    QPainter INSCODE AI 创作助手: QPainter是Qt中的一个类,用于在窗口、图像或其他用户界面上绘制图形和文本。它提供了一些方便的方法来画线、矩形、圆、多边形和文本 QPainter绘图函数 INSCODE AI 创作助手: QPainter是Qt中一个用于绘图的类,它提供了一系列的绘图函数。以下是一些

    2024年02月05日
    浏览(40)
  • QT(QPainter画圆弧)

    本篇文章给大家介绍一下如何使用QPainter来画圆弧。 drawArc() 函数是 Qt 绘图类库中的一个函数,用于在画布上绘制圆弧。可以通过设置起点角度和圆弧弧度来控制圆弧的绘制效果。 函数原型如下: 其中,参数 x 和 y 指定圆弧所在矩形的左上角坐标,参数 width 和 height 分别指定

    2024年02月15日
    浏览(35)
  • Qt QPainter

    QPainter需要在QPaintEvent中绘画 绘画需要笔 QPainter QPaintEvent QPen 建立painter之后就可以绘画,pen这些都有默认实现 画家必须传递this指针才能激活。     圆用椭圆画 重新绘画只需要重新加入画笔就可以 painter.setPen(pen); // 重新设置画笔 抗锯齿能力---setRenderHint 画出来的远见更加光

    2024年02月09日
    浏览(37)
  • Qt学习06:QPainter绘画

    文章首发于我的个人博客:欢迎大佬们来逛逛 完整Qt学习项目地址:源码地址 Paint System Qt的绘制系统支持在屏幕和打印设备上使用相同的API进行绘制,主要基于QPainter、QPaintDevice和QPaintEngine类。 QPainter用于执行绘图操作,QPaintDevice是二维空间的抽象,可以使用QPainter在其上绘

    2024年02月08日
    浏览(34)
  • Vc - Qt - QPainter translate

    QPainter的translate()函数是用来对绘制坐标系统进行平移操作的方法。它可以将绘制的原点(坐标轴的起始点)在水平和垂直方向上进行平移。以下是一个使用QPainter的translate()方法进行坐标平移的示例代码: 在这个示例中,首先创建一个QPainter对象,并通过this参数指定绘制的目

    2024年02月14日
    浏览(41)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包