“这的确是一个大问题。”红衣黛眉微微挑起,现在他们是厉害,可是一旦空间主神超越主神的话,那么就不是数量能弥补的,就像普通法则强者一堆面对主神一样,就算几十个一起上也是被主神一招灭杀,甚至是意念灭杀,根本翻不起任何风浪。

drawCenterColor


由于上位机需要绘制电压电阻表盘,如下图所示:

后来,在网上找阿找,还是没找到满意的,索性自己来画控件算了,由于第一次画控件,所以花了我2天时间,才画好

效果图如下:

上图的所有颜色(包括滑动的渐变/单一颜色,以及字体颜色)都可以自定义,包括图标也可以(上面的电阻图标,网上没找到好看的,所以很丑~)

整体效果图如下所示:

 

介绍

代码里添加了自适应设置,根据窗口大小自动改变标签,图标,刻度值,中心圆数值等

代码里集成了定时器,可以通过setTimerType(int msec,int v)成员函数实现表盘指针旋转快慢,每过多少msec,跑多少值(v),如果msec=0或者v=0,则表示不用定时器,直接跳到终点。

代码里通过setGradientColorMode(QList<QColor>& Qcolors)成员函数可以自定义一组渐变颜色.

也可以通过setSingleColorMode(QColor color)成员函数自定义单一颜色(上图2就是设置的单一颜色).

 

 

 

代码介绍

1.代码里通过 painter类来绘图,其中paintEvent()函数如下所示

void Dial::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    painter.setPen(Qt::NoPen);
    painter.setRenderHint(QPainter::Antialiasing,true);
    painter.setRenderHint(QPainter::SmoothPixmapTransform);
    painter.translate(width()/2,height()/2);
    radius = qMin(width(),height())/2;
    centerR=radius*0.4;       //设置中心圆大小
    drawObkColor(painter);           //外圆盘
    drawScalebkColor(painter);      //画刻度圆
    drawslideScaleColor(painter);   //画划过的颜色
    drawShade(painter);            //画阴影
    drawScaleColor(painter);
    drawbkColor(painter);          //画内圆
    drawScaleTextColor(painter);   //画刻度值
    drawPointColor(painter);
    drawCenterColor(painter);      //绘制中心圆
    drawIconValueColor(painter);
    drawlabelColor(painter);
}

2.然后进入drawObkColor()函数,来绘画外圆盘,函数如下所示

void Dial::drawObkColor(QPainter& paint)      //绘制外圆
{
        paint.save();
        QConicalGradient  Conical(0,0,90);
        Conical.setColorAt(0,oobkColor);
        Conical.setColorAt(0.5,oobkColor);
        Conical.setColorAt(0.12,oobkColor.darker(40));
        Conical.setColorAt(0.88,oobkColor.darker(40));
        Conical.setColorAt(0.4,oobkColor.darker(30));
        Conical.setColorAt(0.6,oobkColor.darker(30));
        Conical.setColorAt(0.25,oobkColor.darker(160));
        Conical.setColorAt(0.75,oobkColor.darker(160));
        Conical.setColorAt(1,oobkColor);
        paint.setBrush(Conical);
        paint.drawEllipse(QPointF(0,0), radius*0.96,radius*0.98);
        Conical.setAngle(270);
        Conical.setColorAt(0,obkColor.darker(40));
        Conical.setColorAt(0.5,obkColor.darker(40));
        Conical.setColorAt(0.25,obkColor.darker(160));
        Conical.setColorAt(0.75,obkColor.darker(160));
        paint.setBrush(Conical);
        paint.drawEllipse(QPointF(0,0), radius*0.93,radius*0.94);
        paint.restore();
}

外圆盘效果如下所示:

3.然后接下来开始画刻度圆,画了它后,才能开始画刻度和划过的颜色等

void Dial::drawScalebkColor(QPainter &paint)        //绘制刻度圆
{
    paint.save();
    paint.setBrush(bkColor);
    paint.drawEllipse(QPointF(0,0), radius*0.90,radius*0.90);

    paint.restore();
}

4.然后接下来开始画划过的颜色,就是上图指针划过后都会带有颜色的那种 (以单色颜色为例)

void Dial::drawslideScaleColor(QPainter &paint)    //画划过的颜色
{
    /*单一颜色*/  

    int Star_Angle= 210*16-(int)((value/(maxvalue-minvalue))*240*16);

    int spanAngle  =  210*16 - Star_Angle;

    if(spanAngle==0)
        return ;



    qreal SlideBottom =  ((qreal)radius*0.77)/((qreal)radius*0.90);    

    qreal SlideCenterTop = 1-(1-SlideBottom)/3;                        
    qreal SlideCenterBottom = SlideBottom+(1-SlideBottom)/3+0.01;      

    paint.save();

    QColor Tint_SlideColor = SingleSlideColor;


    QRadialGradient Radial(0,0,radius*0.90);


    Tint_SlideColor.setAlpha(40);
    Radial.setColorAt(1,Tint_SlideColor);
    Radial.setColorAt(SlideBottom-0.005,Tint_SlideColor);
    Radial.setColorAt(0,Qt::transparent);
    Radial.setColorAt(SlideBottom-0.006,Qt::transparent);


    Tint_SlideColor = SingleSlideColor;
    Tint_SlideColor.setAlpha(50);


    Radial.setColorAt(SlideCenterBottom-0.03,Tint_SlideColor);
    Radial.setColorAt(SlideCenterTop+0.03,Tint_SlideColor);

    Tint_SlideColor = SingleSlideColor;
    Tint_SlideColor.setAlpha(50);
    Radial.setColorAt(SlideCenterBottom-0.01,SingleSlideColor.darker(200));
    Radial.setColorAt(SlideCenterTop+0.01,SingleSlideColor.darker(200));

    Radial.setColorAt(SlideCenterBottom,SingleSlideColor);
    Radial.setColorAt(SlideCenterTop,SingleSlideColor);

    paint.setPen(Qt::NoPen);
    paint.setBrush(Radial);

    paint.drawPie(QRectF((qreal)-radius*0.90,(qreal)-radius*0.90,(qreal)radius*1.80,(qreal)radius*1.80),Star_Angle,spanAngle);

    paint.restore();
 


  //... ...  
   
}

效果:

5.然后接下来便开始画刻度和刻度值,其中比较重要的就是绘制刻度值

由于Painter的rotate()旋转文字时,也会将文字倾斜了,所以我们需要自定义rotate()函数

具体参考我另一篇rotate函数分析:    31.QPainter-rotate()函数分析-文字旋转不倾斜,图片旋转实现等待

 

drawScaleTextColor()画刻度值函数如下所示:

void Dial::drawScaleTextColor(QPainter &paint)    //绘制刻度值
{
    /*绘制文字刻度*/
    paint.save();

    paint.setPen(ScaleColor);

    QString text("%1");

    int size;           //动态计算文字大小

    if(radius<=120)
       size = 10;
    else if((radius>120)&&(radius<500))
       size = 13+(radius-120)/30;
    else if(radius>=500)
       size = 13+(radius-120)/40;

    paint.setFont(QFont("Euphemia",size,QFont::DemiBold));

    QPoint TextPoint(0,radius*0.77-size*0.9);        //设置90°的文字
    TextPoint = CustomRotate(TextPoint,90,240);   //获取点=210°的文字位置
    qreal TextRotate=210;

     for(int i=0;i<7;i++)              //设置7个刻度值
    {
    
          //... ...

          qreal Current_Value =(qreal)i*((maxvalue-minvalue)/6);

          if((Current_Value>value&&(paint.pen().color()!=ScaleColor)))
          {
              paint.setPen(ScaleColor);

          }
          else if((Current_Value<=value&&(paint.pen().color()!=slideScaleColor)))
          {
              paint.setPen(slideScaleColor);
          }

       paint.drawText(QRect(TextPoint.x()-size*1.5+offest[i].x(),TextPoint.y()-size*1.2+offest[i].y(),size*3,size*2.4),alingns[i],text.arg((maxvalue-minvalue)*i/6));
       TextPoint = CustomRotate(TextPoint,TextRotate,40);   //获取点=210°的文字位置
       TextRotate-=40;
    }

    paint.restore();
}    

效果如下所示:

 6.然后接下来开始画指针

void Dial::drawPointColor(QPainter &paint)          //绘制指针
{

    qreal PointTop;                //动态计算指针头
    qreal PointBottom;             //动态计算指针底部
    if(radius<=120)
    {
        PointTop = 2;
        PointBottom = 6;
    }
    else if((radius>120)&&(radius<500))
    {
        PointTop = 2 + (radius-120)/100;
        PointBottom = PointTop*3;
    }
    else if(radius>=500)
    {
        PointTop = 2 + (radius-120)/140;
        PointBottom = PointTop*3;
    }

    //指针
    const QPointF  Pointer[4] = {
        QPointF(- PointTop / 2, radius*0.80),
        QPointF(PointTop / 2, radius*0.80),
        QPointF(PointBottom / 2, centerR*0.9),
        QPointF(-PointBottom / 2, centerR*0.9)
    };

    paint.save();


    paint.setBrush(PointerColor);
    paint.setPen(PointerColor.darker(300));


    qreal Current_Angle =60+(int)((value/(maxvalue-minvalue))*240);

    paint.rotate(Current_Angle);

    paint.drawConvexPolygon(Pointer, 4);

    paint.restore();

}

效果如下:

7.然后继续画中心圆

void Dial::drawCenterColor(QPainter &paint)      //绘制中心圆
{
    paint.save();

    QRadialGradient Radial(0,0,centerR,0,0);

    Radial.setColorAt(1,centercolor.lighter(170));
    Radial.setColorAt(0.98,centercolor.lighter(150));
    Radial.setColorAt(0.95,centercolor.lighter(130));
    Radial.setColorAt(0.70,centercolor);

    paint.setBrush(Radial);
    paint.drawEllipse(QPointF(0,0), centerR,centerR);

    paint.restore();

}

效果如下:

 

 

 

剩下的代码就是画标签和值还有图标啦,由于渐变代码多一些,具体参考的话,源代码下载地址为:

https://download.csdn.net/download/qq_37997682/10509237

当前文章:http://hnhdqp.com/31836.html

发布时间:2019-02-24 03:11:09

联众棋牌游戏下载 至尊棋牌杰克作弊器ios 菠萝扑克终极起手牌教程 扑客捕鱼红包 联众游戏手机版 网上赢钱棋牌游戏平台 棋牌新教师2019 断卡勾麻将可以开挂吗 可靠的棋牌游戏刷分器 棋牌游戏刷分漏洞软件

编辑:安道道宗

相关新闻

7种小病最易“拖”成癌

2019-02-24 01:21:41

济源院倨工贸有限公司

刀塔传奇十月签到英雄巫医属性技能出装解析

2019-02-24 00:00:30

松原荚拿集团有限责任公司

子洲“X+调查组”谈话机制让咬耳扯袖成常态

2019-02-24 03:51:40

天长缕俜网络技术有限公司

热门推荐

  • 商务休闲,阿仕顿男士中长款羊毛呢大衣99元(200元券)
  • GCC VR/AR/AI行业应用大赛获奖名单揭晓 VR 2.0时代匠心内容全搜罗
  • SD男女加绒软壳冲锋裤199→59元/赫德雅男士贡缎棉休闲裤99→39元
  • 微软申请iPhone配件专利,Windows 10 PC也能打电话
  • 五五开被爆王者荣耀段位“造假”:张大仙躺着中枪
  • 只见钱来却未见车量产:互联网车企泥沙俱下
  • 软媒发布魔方6.21正式版下载:驱动安装清理等17处改进
  • 搭建Maven私服那点事
  • HTC U11+提前上架京东:Sense UI大变
  • 中国乒协:对男乒弃赛深感震惊痛心
  • 河北新闻网版权所有 本站点信息未经允许不得复制或镜像 法律顾问:禾城棋牌 小米斗地主
  • 福建麻将作弊器 copyright ? 2000 - 2016
  • 新闻热线:0311-67563366 广告热线:0311-67562966 新闻投诉:0311-67562994
  • 冀ICP备 09047539号-1 | 互联网新闻信息服务许可证编号:1312006002
  • 广播电视节目制作经营许可证(冀)字第101号|信息网络传播视听节目许可证0311618号
  • 星月棋牌ios 最新棋牌游戏平台华军 中油棋牌下载 2019最新赚钱棋牌游戏