Qt 进度条的实现示例

一、前言

  有时我们需要在表格(QTableWidget)、树状栏(QTreeWidget)中直观显示任务进度或消耗百分比,达到报表显示的形式,可通过重写QLabel的方式实现。

  1、进度条控件功能

    1)可设置值动态变化

    2)可设置警戒值

    3)可设置正常颜色和报警颜色

    4)可设置边框渐变颜色

    5)可设置变化时每次移动的步长

    6)可设置错误时显示错误描述

    7)可设置显示值保留小数的位数

    8)可设置边框圆角角度/背景进度圆角角度/头部圆角角度    

  2、实现效果

  

二、实现过程

  1、运行环境Qt5.5 VS2013

  2、继承QLabel重写ProgressLabel控件

/***********************************************************************
  作者:liangtianmanyue(QQ:1660941209) 2021-05-30
  功能:进度控件
  1、可设置值动态变化
  2、可设置警戒值
  3、可设置正常颜色和报警颜色
  4、可设置边框渐变颜色
  5、可设置变化时每次移动的步长
  6、可设置错误时显示错误描述
  7、可设置显示值保留小数的位数
  8、可设置边框圆角角度/背景进度圆角角度/头部圆角角度
  ************************************************************************/

  #ifndef PROGRESS_LABEL_H
  #define PROGRESS_LABEL_H

  #include <QLabel>
  #include <QWidget>

  #ifdef Plugin
  #if (QT_VERSION < QT_VERSION_CHECK(5,7,0))
  #include <QtDesigner/QDesignerExportWidget>
  #else
  #include <QtUiPlugin/QDesignerExportWidget>
  #endif

  class QDESIGNER_WIDGET_EXPORT ProgressLabel : public QLabel
  #else
  class ProgressLabel : public QLabel
  #endif
  {
      Q_OBJECT
      Q_PROPERTY(double minValue READ getMinValue WRITE setMinValue)
      Q_PROPERTY(double maxValue READ getMaxValue WRITE setMaxValue)
      Q_PROPERTY(double value READ getValue WRITE setValue)
      Q_PROPERTY(double alarmValue READ getAlarmValue WRITE setAlarmValue)

      Q_PROPERTY(double step READ getStep WRITE setStep)
      Q_PROPERTY(int decimals READ getDecimals WRITE setDecimals)
      Q_PROPERTY(int borderRadius READ getBorderRadius WRITE setBorderRadius)
      Q_PROPERTY(int bgRadius READ getBgRadius WRITE setBgRadius)
      Q_PROPERTY(int headRadius READ getHeadRadius WRITE setHeadRadius)

      Q_PROPERTY(QColor borderColorStart READ getBorderColorStart WRITE setBorderColorStart)
      Q_PROPERTY(QColor borderColorEnd READ getBorderColorEnd WRITE setBorderColorEnd)

      Q_PROPERTY(QColor alarmColorStart READ getAlarmColorStart WRITE setAlarmColorStart)
      Q_PROPERTY(QColor alarmColorEnd READ getAlarmColorEnd WRITE setAlarmColorEnd)

      Q_PROPERTY(QColor normalColorStart READ getNormalColorStart WRITE setNormalColorStart)
      Q_PROPERTY(QColor normalColorEnd READ getNormalColorEnd WRITE setNormalColorEnd)

  public:
      explicit ProgressLabel(QWidget *parent = 0);
      ~ProgressLabel();

  protected:
      void paintEvent(QPaintEvent *);
      void drawBg(QPainter *painter);

  private slots:
      void updateValue();

  public:
      double getMinValue()            const;
      double getMaxValue()            const;
      double getValue()               const;
      double getAlarmValue()          const;

      double getStep()                const;
      int getBorderRadius()           const;
      int getBgRadius()               const;
      int getHeadRadius()             const;

      QColor getBorderColorStart()    const;
      QColor getBorderColorEnd()      const;

      QColor getAlarmColorStart()     const;
      QColor getAlarmColorEnd()       const;

      QColor getNormalColorStart()    const;
      QColor getNormalColorEnd()      const;

      QSize sizeHint()                const;
      QSize minimumSizeHint()         const;

  public Q_SLOTS:
      //设置范围值
      void setRange(double minValue, double maxValue);
      void setRange(int minValue, int maxValue);

      //设置最大最小值
      void setMinValue(double minValue);
      void setMaxValue(double maxValue);

      //设置显示值
      void setValue(double value);
      void setValue(int value);

     //设置警戒值
     void setAlarmValue(double alarmValue);
     void setAlarmValue(int alarmValue);

     //设置步长
     void setStep(double step);
     void setStep(int step);

     //小数点位数
     int getDecimals();
     void setDecimals(int decimals);

     //设置边框圆角角度
     void setBorderRadius(int borderRadius);
     //设置背景圆角角度
     void setBgRadius(int bgRadius);
     //设置头部圆角角度
     void setHeadRadius(int headRadius);

     //设置边框渐变颜色
     void setBorderColorStart(const QColor &borderColorStart);
     void setBorderColorEnd(const QColor &borderColorEnd);

     //设置报警时的渐变颜色
     void setAlarmColorStart(const QColor &alarmColorStart);
     void setAlarmColorEnd(const QColor &alarmColorEnd);

     //设置正常时的渐变颜色
     void setNormalColorStart(const QColor &normalColorStart);
     void setNormalColorEnd(const QColor &normalColorEnd);

     //正常、异常显示
     void setNormalState();
     void setErrorText(const QString &text);

 Q_SIGNALS:
     void valueChanged(double value);

 private:
     bool m_IsError;                 //是否出错
     QString m_ErrorText;            //错误描述

     double minValue;                //最小值
     double maxValue;                //最大值
     double value;                   //目标电量
     double alarmValue;              //警戒值
     int decimals;                   //显示小数点后位数
     double step;                    //每次移动的步长
     int borderRadius;               //边框圆角角度
     int bgRadius;                   //背景进度圆角角度
     int headRadius;                 //头部圆角角度

     QColor borderColorStart;        //边框渐变开始颜色
     QColor borderColorEnd;          //边框渐变结束颜色

     QColor alarmColorStart;         //超警戒值时的渐变开始颜色
     QColor alarmColorEnd;           //超警戒值时的渐变结束颜色

     QColor normalColorStart;        //正常时的渐变开始颜色
     QColor normalColorEnd;          //正常时的渐变结束颜色

     bool isForward;                 //是否往前移
     double currentValue;            //当前值
     QRectF mainRect;                //主体区域
     QTimer *timer;                  //绘制定时器
 };

 #endif // PROGRESS_LABEL_H

  3、重写paintEvent事件,根据是否有出错,绘制出错信息或值

 void ProgressLabel::paintEvent(QPaintEvent *)
  {
      //绘制准备工作,启用反锯齿
      QPainter painter(this);
      painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);

      //获取边框区域
      QPointF topLeft(2, 2);
      QPointF bottomRight(width() - 4, height() - 2);
     mainRect = QRectF(topLeft, bottomRight);
     //绘制背景
     drawBg(&painter);
 }

 void ProgressLabel::drawBg(QPainter *painter)
 {
     if(!m_IsError)
     {
         painter->save();
         QLinearGradient gradient(QPointF(0, 0), QPointF(0, height()));
         if (currentValue >= alarmValue)
         {
             gradient.setColorAt(0.0, alarmColorStart);
             gradient.setColorAt(1.0, alarmColorEnd);
         }
         else
         {
             gradient.setColorAt(0.0, normalColorStart);
             gradient.setColorAt(1.0, normalColorEnd);
         }

         double min = qMin(width(), height());
         int margin =  min / 20;
         double unit = (mainRect.width() - (margin * 2)) / 100;
         double width = currentValue * unit;
         QPointF topLeft(mainRect.topLeft().x() + margin, mainRect.topLeft().y() + margin);
         QPointF bottomRight(width + margin + , mainRect.bottomRight().y() - margin);
         QRectF rect(topLeft, bottomRight);

         painter->setPen(Qt::NoPen);
         painter->setBrush(gradient);
         painter->drawRoundedRect(rect, bgRadius, bgRadius);
         painter->restore();
     }

     //写进度
     painter->save();
     QPen pen(Qt::SolidLine);
     pen.setWidth(1);
     if(m_IsError)
         pen.setColor(Qt::red);
     else
         pen.setColor(Qt::black);
     painter->setPen(pen);
     painter->setBrush(Qt::NoBrush);
     if(m_IsError)
         painter->drawText(mainRect, Qt::AlignCenter, m_ErrorText);
     else
         painter->drawText(mainRect, Qt::AlignCenter, QString("%1%").arg(currentValue, 0, 'f', decimals));
     painter->restore();
 }

  4、刷新值时采用定时器定时刷新方式,达到动态效果

创建定时器

timer = new QTimer(this);
timer->setInterval(10);
connect(timer, SIGNAL(timeout()), this, SLOT(updateValue()));

按step值刷新

 void ProgressLabel::updateValue()
  {
      if (isForward)
      {
          currentValue -= step;

          if (currentValue <= value)
          {
              timer->stop();
             currentValue = value;//保持真实性
         }
     }
     else
     {
         currentValue += step;

         if (currentValue >= value)
         {
             timer->stop();
             currentValue = value;//保持真实性
         }
     }

     this->update();
 }

  5、外部设置值的时候,清除错误标志,并启动定时器

 void ProgressLabel::setValue(double value)
  {
      m_IsError = false;
      //值和当前值一致则无需处理
      if (value == this->value)
          return;

      //值小于最小值则取最小值,大于最大值则取最大值
      if (value < minValue)
         value = minValue;
     else if (value > maxValue)
         value = maxValue;

     if (value > currentValue)
         isForward = false;
     else if (value < currentValue)
         isForward = true;
     else
         return;

     this->value = value;
     this->update();
     emit valueChanged(value);
     timer->start();
 }

到此这篇关于Qt 进度条的实现示例的文章就介绍到这了,更多相关Qt 进度条内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Qt自定义控件实现圆盘进度条

    本文实例为大家分享了Qt圆盘进度条的具体代码,供大家参考,具体内容如下 自定义控件二:圆盘进度条 上效果图: 主要思路:使用qpainter根据图形需求 画圆和圆弧,画指针(多边形,指定坐标即可),根据具体的value值旋转坐标系,使指针达到旋转效果,旋转度数是根据value值,总共360度,占比求得.最中间需要画文字上去,每次更新value时调用update()方法,重绘界面. 主要代码:CMPassrate1.cpp void CMPassrate1::paintEvent(QPaintEv

  • Qt实现网易云音乐进度条效果

    Qt网易云音乐中的音乐进度条是一个小小的难关,今天在Android写记录步数进度条中突然想到了它.移动端和电脑端自定义写界面模块的方式大同小异,现在将其中的代码放出,供大家点评参阅.代码还是比较混乱,请各位大侠还是要多多包涵. 其中我把这个类打包出来,类的实现就是靠painevent来完成的.其中的两个自定义信号是为了快进快退而准备的,它们的实现不在本类中,大小位置也是在外部类中实现.其中的一些位置参数,大小参数属于本身创作需要,如有迷惑,还望海涵. 代码: #ifndef DOWN_PROGR

  • Qt自定义控件实现圆圈加载进度条

    本文实例为大家分享了Qt实现圆圈加载进度条的具体代码,供大家参考,具体内容如下 先看效果图: 思路:画一个占270度的圆弧,然后定义一个定时器,定时旋转坐标系,实现旋转的效果.圆弧需要使用渐变色,实现颜色越来越浅的效果 关键代码:CMProcessBar1.cpp CMProcessBar1::CMProcessBar1(QWidget *parent) : QWidget(parent), ui(new Ui::CMProcessBar1) { ui->setupUi(this); QTime

  • Qt 进度条的实现示例

    一.前言 有时我们需要在表格(QTableWidget).树状栏(QTreeWidget)中直观显示任务进度或消耗百分比,达到报表显示的形式,可通过重写QLabel的方式实现. 1.进度条控件功能 1)可设置值动态变化 2)可设置警戒值 3)可设置正常颜色和报警颜色 4)可设置边框渐变颜色 5)可设置变化时每次移动的步长 6)可设置错误时显示错误描述 7)可设置显示值保留小数的位数 8)可设置边框圆角角度/背景进度圆角角度/头部圆角角度 2.实现效果 二.实现过程 1.运行环境Qt5.5 VS2

  • Qt编写提示进度条的实现示例

    目录 一.前言 二.实现的功能 三.效果图 四.头文件代码 五.核心代码 六.控件介绍 一.前言 我们在很多的安装包中,在安装过程中,经常可以在底部看到一个漂亮的进度条,上面悬浮着显示对应的进度,然后底部进度多种颜色渐变展示,Qt自带的进度条或者操作系统的进度条样式,不够炫,这次索性直接来个自定义绘制实现,至于是继承QWidget类还是QProgressBar类,都无所谓,如果是继承自QWidget类的话,就需要自己设置最大值最小值范围值,而继承自QProgressBar的话就可以直接用自带的函

  • react-native 圆弧拖动进度条实现的示例代码

    本文介绍了react-native 圆弧拖动进度条实现的示例代码,分享给大家,具体如下: 先上效果图 因为需求需要实现这个效果图 非原生实现, 难点1:绘制 使用svg 难点2:点击事件的处理 难点3:封装 由于绘制需要是使用svg 此处自行百度 按照svg以及api 教学 视图代码块 render() { return ( <View pointerEvents={'box-only'} //事件处理 {...this._panResponder.panHandlers}> //实际圆环 {

  • golang 进度条功能实现示例

    最近在做一个需求,功能很简单,就是开发一个轻量级客户端,将一个指定文件中的内容通过 TCP 发送到服务器.由于该文件特别大,有可能到达100G的数量级,因此处理起来会比较慢,为了给用户提供比较友好的展示界面,因此,在其中加入了进度条显示功能. 在这里,说一下我在实现该进度条功能时的一些思路. 成果演示 先看一下最终的成品效果展示: 该进度条一共分三部分组成,第一部分是主体进度条,第二部分是百分比,第三部分是当前完成的数据和总数据的一个动态展示. 源码分析 由于是要在终端上打印出进度条的效果,因此

  • vue+element+springboot实现文件下载进度条展现功能示例

    目录 1. 需求背景 2. 优化方案 3. 具体实现 3.1 前端代码 3.2 后台代码 4. 总结 本文主要介绍了vue+element+springboot实现文件下载进度条展现功能示例,分享给大家,具体如下 最终效果图 1. 需求背景 最近接到一个优化需求,原系统文件下载功能体验不友好,特别是下载一些比较耗时的文件,用户在页面上傻等不知道下载的进度是怎么样的,总以为是系统卡死了. 2. 优化方案 后台优化下载速度(可以研究一下分片下载,这里不做展开) 改造前端用户体验(比如点击下载后你要显

  • 微信小程序实现实时圆形进度条的方法示例

    前言 最近工作中为了做一个录制按钮,研究了下小程序的实时圆形进度条实现,下面这篇文章就来给大家详细的介绍了实现的方法示例,废话不多说,先来看看效果图吧. 效果图如下 初始状态 点击中间按钮开始绘制 绘制过程 绘制结束 实现思路 建立两个canvas标签,先绘制底层的浅灰色圆圈背景,再绘制上层的红色进度条. WXML代码 <view class="wrap"> <view class="circle-box"> <canvas class

  • Android开发之进度条ProgressBar的示例代码

    说明 ProgressBar一般用于显示一个过程,例如数据加载过程,文件下载进度,音乐播放进度等. 默认形式ProgressBar 默认方式下,ProgressBar显示为圆形进度,循环转圈,不显示具体的进度值,控制其显隐藏即可,如下 适用于界面加载 //xml中 <ProgressBar android:layout_width="wrap_content" android:layout_height="wrap_content" /> //代码中控制

  • 基于Blod的ajax进度条下载实现示例代码

    普通的浏览器下载 在web开发中,如果要实现下载功能,往往都是使用新开web页面或者是使用iframe的形式.实现起来其实很简单: <a target="_blank" href="download.zip" rel="external nofollow" >点击下载</a> //或者 <iframe style="display:none" src="download.zip"

  • Android 带进度条的WebView 示例代码

    前言 如果不使用系统自带的TitleBar(即Activity被设置@android:style/Theme.NoTitleBar),那就需要自己来写进度条了,这里封装了一个自定义控件和加载网页的公共Activity,方便使用. 正文 一.截图 二.自定义控件 复制代码 /** * 带进度条的WebView * http://www.cnblogs.com/over140/archive/2013/03/07/2947721.html * */ @SuppressWarnings("deprec

  • Kotlin实现半圆形进度条的方法示例

    Kotlin的简要介绍 在开发之前,很多同学一定有很多疑问,Kotlin到底有啥好处,怎么和现有的项目共存呢?Java那么些特性Kotlin都有吗?嗯,让我们一一来看. 以下内容摘自:Kotlin的官方网站:https://www.kotlincn.net/docs/reference/android-overview.html Kotlin 非常适合开发 Android 应用程序,将现代语言的所有优势带入 Android 平台而不会引入任何新的限制: 兼容性:Kotlin 与 JDK 6 完全

随机推荐