热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Qt进度条的实现示例_C语言

进度条在很多时候都可以用到,有时我们需要在表格,树状栏中直观显示任务进度或消耗百分比,本文就详细的介绍一下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 
  #include 
  
  #ifdef Plugin
  #if (QT_VERSION 
  #else
  #include 
  #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  maxValue)
         value = maxValue;
 
     if (value > currentValue)
         isForward = false;
     else if (value value = value;
     this->update();
     emit valueChanged(value);
     timer->start();
 }

推荐阅读
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • Java太阳系小游戏分析和源码详解
    本文介绍了一个基于Java的太阳系小游戏的分析和源码详解。通过对面向对象的知识的学习和实践,作者实现了太阳系各行星绕太阳转的效果。文章详细介绍了游戏的设计思路和源码结构,包括工具类、常量、图片加载、面板等。通过这个小游戏的制作,读者可以巩固和应用所学的知识,如类的继承、方法的重载与重写、多态和封装等。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • XML介绍与使用的概述及标签规则
    本文介绍了XML的基本概念和用途,包括XML的可扩展性和标签的自定义特性。同时还详细解释了XML标签的规则,包括标签的尖括号和合法标识符的组成,标签必须成对出现的原则以及特殊标签的使用方法。通过本文的阅读,读者可以对XML的基本知识有一个全面的了解。 ... [详细]
  • 标题: ... [详细]
  • Java学习笔记之面向对象编程(OOP)
    本文介绍了Java学习笔记中的面向对象编程(OOP)内容,包括OOP的三大特性(封装、继承、多态)和五大原则(单一职责原则、开放封闭原则、里式替换原则、依赖倒置原则)。通过学习OOP,可以提高代码复用性、拓展性和安全性。 ... [详细]
  • iOS超签签名服务器搭建及其优劣势
    本文介绍了搭建iOS超签签名服务器的原因和优势,包括不掉签、用户可以直接安装不需要信任、体验好等。同时也提到了超签的劣势,即一个证书只能安装100个,成本较高。文章还详细介绍了超签的实现原理,包括用户请求服务器安装mobileconfig文件、服务器调用苹果接口添加udid等步骤。最后,还提到了生成mobileconfig文件和导出AppleWorldwideDeveloperRelationsCertificationAuthority证书的方法。 ... [详细]
  • 本文介绍了在满足特定条件时如何在输入字段中使用默认值的方法和相应的代码。当输入字段填充100或更多的金额时,使用50作为默认值;当输入字段填充有-20或更多(负数)时,使用-10作为默认值。文章还提供了相关的JavaScript和Jquery代码,用于动态地根据条件使用默认值。 ... [详细]
  • node.jsrequire和ES6导入导出的区别原 ... [详细]
  • Python基础知识:注释、输出和input交互
    本文介绍了Python基础知识,包括注释的使用、输出函数print的用法以及input函数的交互功能。其中涉及到字符串和整数的类型转换等内容。 ... [详细]
  • 本文介绍了解决java开源项目apache commons email简单使用报错的方法,包括使用正确的JAR包和正确的代码配置,以及相关参数的设置。详细介绍了如何使用apache commons email发送邮件。 ... [详细]
author-avatar
迪信通张磊
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有