QT-QProgressBar动态实现多彩进度条(详解)

喜欢ヅ旅行 2023-02-13 04:58 181阅读 0赞

如下图所示:

1182576-20180617160807066-309995018.png

效果如下:

1182576-20180617160844946-38080236.gif

(gif录制的动画效果不好,所以颜色有间隙)

介绍

通过qss实现,只需要一个多彩背景图,通过QImage获取颜色,然后来设置进度条,便可以实现动态多彩进度条(根据图片设定颜色)

其中,上面3个进度条就是通过以下3个图片实现的:

1182576-20180617161811935-954432925.png

如果想实现其它颜色,只需要改图片即可

代码如下

ProgressBar.h:

  1. #ifndef PROGRESSBAR_H
  2. #define PROGRESSBAR_H
  3. #include <QtGui>
  4. class ProgressBar : public QWidget
  5. {
  6. Q_OBJECT
  7. QProgressBar m_bar;
  8. QLabel m_value;
  9. QSlider m_slider;
  10. QImage m_image;
  11. protected slots:
  12. void onvalueChanged(int value);
  13. public:
  14. explicit ProgressBar(const QString& fileName,QWidget *parent = 0);
  15. };
  16. #endif // PROGRESSBAR_H

ProgressBar.cpp:

  1. #include "ProgressBar.h"
  2. ProgressBar:: ProgressBar(const QString& fileName,QWidget *parent ) :
  3. QWidget(parent),
  4. m_bar(this),
  5. m_value(this),
  6. m_slider(this),
  7. m_image(fileName)
  8. {
  9. m_bar.setMaximum(100);
  10. m_bar.setMinimum(0);
  11. m_bar.setValue(0);
  12. m_bar.setTextVisible(false);
  13. m_bar.setFixedHeight(20);
  14. m_slider.setMaximum(100);
  15. m_slider.setMinimum(0);
  16. m_slider.setValue(0);
  17. m_slider.setOrientation(Qt::Horizontal);
  18. m_value.setText(QString("%1%").arg(m_bar.value()));
  19. m_value.setAlignment(Qt::AlignRight|Qt::AlignVCenter);
  20. m_value.setMinimumWidth(40);
  21. /*设置布局*/
  22. QHBoxLayout* hlayout = new QHBoxLayout();
  23. hlayout->addWidget(&m_slider);
  24. hlayout->addWidget(&m_value,0,Qt::AlignRight);
  25. QVBoxLayout* vlayout = new QVBoxLayout();
  26. vlayout->addWidget(&m_bar);
  27. vlayout->addLayout(hlayout);
  28. setLayout(vlayout);
  29. connect(&m_slider,SIGNAL(valueChanged ( int)),&m_bar,SLOT(setValue (int)));
  30. connect(&m_bar,SIGNAL(valueChanged ( int)),this,SLOT(onvalueChanged (int)));
  31. onvalueChanged(m_bar.value());
  32. }
  33. void ProgressBar::onvalueChanged(int value)
  34. {
  35. QString qss= "QProgressBar{
  36. "
  37. "border: 1px solid rgb(16, 135, 209);"
  38. "background: rgba(248,248,255,180);"
  39. "border-radius: 6px; }""QProgressBar::chunk:enabled {
  40. "
  41. "border-radius: 4px; "
  42. "background: qlineargradient(x1:0, y1:0, x2:1, y2:0" ;
  43. double v = m_bar.maximum();
  44. double EndColor=static_cast<double>(value)/v ; //获取比例
  45. for(int i=0;i<100;i++)
  46. {
  47. double Current = EndColor*i/100;
  48. QRgb rgb = m_image.pixel((m_image.width()-1)*Current,m_image.height()/2);
  49. QColor c(rgb);
  50. qss.append(QString(",stop:%1 rgb(%2,%3,%4)").arg(i/100.0).arg(c.red()).arg(c.green()).arg(c.blue()));
  51. }
  52. qss.append(");}");
  53. m_bar.setStyleSheet(qss);
  54. m_value.setText(QString("%1%").arg(m_bar.value()));
  55. }

发表评论

表情:
评论列表 (有 0 条评论,181人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Java实现进度

    Java实现进度条 在Java编程中,经常需要显示进度条来表示任务的完成进度。进度条是一种直观的方式,可以让用户了解到程序运行的状态。本文将介绍如何使用Java实现一个简单的