91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

使用Qt怎么實現進度條

發布時間:2021-06-02 16:25:06 來源:億速云 閱讀:426 作者:Leah 欄目:開發技術

本篇文章為大家展示了使用Qt怎么實現進度條,內容簡明扼要并且容易理解,絕對能使你眼前一亮,通過這篇文章的詳細介紹希望你能有所收獲。

一、前言

  有時我們需要在表格(QTableWidget)、樹狀欄(QTreeWidget)中直觀顯示任務進度或消耗百分比,達到報表顯示的形式,可通過重寫QLabel的方式實現。

  1、進度條控件功能

    1)可設置值動態變化

    2)可設置警戒值

    3)可設置正常顏色和報警顏色

    4)可設置邊框漸變顏色

    5)可設置變化時每次移動的步長

    6)可設置錯誤時顯示錯誤描述

    7)可設置顯示值保留小數的位數

    8)可設置邊框圓角角度/背景進度圓角角度/頭部圓角角度    

  2、實現效果

  使用Qt怎么實現進度條

二、實現過程

  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怎么實現進度條,你們學到知識或技能了嗎?如果還想學到更多技能或者豐富自己的知識儲備,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

qt
AI

湟源县| 瑞金市| 连平县| SHOW| 曲靖市| 防城港市| 华安县| 根河市| 普洱| 蓬溪县| 阿巴嘎旗| 沁水县| 长葛市| 平遥县| 闸北区| 古蔺县| 大竹县| 南和县| 盐城市| 白玉县| 黄平县| 府谷县| 弥勒县| 荔波县| 湘阴县| 蚌埠市| 三江| 疏附县| 云安县| 金川县| 洛宁县| 仙居县| 满洲里市| 鹿泉市| 台北市| 武陟县| 晋中市| 琼海市| 巨鹿县| 无为县| 道孚县|