Qt浅谈之三十九圆形进度条

时间:2022-08-31 16:35:53

一、简介

        Qt下进度条一般都是水平或垂直的,有时需要一个椭圆或圆来动态显示进度,或用此来显示存储百分比,都是比较适用的。
Qt浅谈之三十九圆形进度条

二、详解

1、代码

(1)widgetdisplay.h
[html]  view plain  copy   Qt浅谈之三十九圆形进度条 Qt浅谈之三十九圆形进度条
  1. #ifndef WIDGET_H  
  2. #define WIDGET_H  
  3.   
  4. #include <QtCore>  
  5. #include <QtGui>  
  6.   
  7. class StorageDisplay : public QWidget  
  8. {  
  9.     Q_OBJECT  
  10. public:  
  11.     StorageDisplay(QWidget *parent = 0);  
  12.     ~StorageDisplay();  
  13.     void setUsedValue(int value);  
  14.     //void setSize(int width, int height);  
  15. protected:  
  16.     void paintEvent(QPaintEvent *event);  
  17.     void resizeEvent (QResizeEvent * event);  
  18.     void mousePressEvent(QMouseEvent *event);  
  19.     void mouseMoveEvent(QMouseEvent *event);  
  20.     void mouseReleaseEvent(QMouseEvent *event);  
  21.     void showEvent(QShowEvent *event);  
  22.     void hideEvent(QHideEvent *event);  
  23.   
  24. private slots:  
  25.     void slotUpdateTimer();  
  26.   
  27. private:  
  28.     QPoint beginDrag;  
  29.     bool bPressFlag;  
  30.   
  31.     QPixmap backGround;  
  32.     int userdVaule;  
  33.     int currentValue;  
  34.     QLabel *startValueLabel;  
  35.     QLabel *endValueLabel;  
  36.     QLabel *dispayValueLabel;  
  37.   
  38.     QTimer *updateTimer;  
  39. };  
  40.   
  41. #endif // WIDGET_H  
(2)widgetdisplay.cpp
[html]  view plain  copy
  1. #include "widgetdisplay.h"  
  2.   
  3. StorageDisplay::StorageDisplay(QWidget *parent)  
  4.     : QWidget(parent, Qt::FramelessWindowHint)  
  5.     , bPressFlag(false)  
  6.     , currentValue(0)  
  7. {  
  8.     QTextCodec *codec = QTextCodec::codecForName("utf8");  
  9.     QTextCodec::setCodecForLocale(codec);  
  10.     QTextCodec::setCodecForCStrings(codec);  
  11.     QTextCodec::setCodecForTr(codec);  
  12.     resize(167, 167);  
  13.     setAutoFillBackground(false);  
  14.     QPalette pal = palette();  
  15.     pal.setColor(QPalette::Background, QColor(0xFF,0xFF,0xFF,0xFF));  
  16.     setPalette(pal);  
  17.   
  18.     startValueLabel = new QLabel(tr("0%"), this);  
  19.     startValueLabel->setFont(QFont("Arial", 11, QFont::Normal));  
  20.     startValueLabel->setStyleSheet("color:#898989");  
  21.   
  22.     endValueLabel = new QLabel(tr("100%"),this);  
  23.     endValueLabel->setFont(QFont("Arial", 11, QFont::Normal));  
  24.     endValueLabel->setStyleSheet("color:#898989");  
  25.   
  26.     dispayValueLabel = new QLabel(this);  
  27.     dispayValueLabel->setStyleSheet("color:#349BDA");  
  28.   
  29.     updateTimer = new QTimer(this);  
  30.     updateTimer->setInterval(20);  
  31.     connect(updateTimer, SIGNAL(timeout()), this, SLOT(slotUpdateTimer()));  
  32. }  
  33.   
  34. StorageDisplay::~StorageDisplay()  
  35. {  
  36.     if (updateTimer->isActive()) {  
  37.         updateTimer->stop();  
  38.     }  
  39.     currentValue = 0;  
  40. }  
  41.   
  42. void StorageDisplay::setUsedValue(int value)  
  43. {  
  44.     userdVaule = value;  
  45. }  
  46.   
  47. void StorageDisplay::showEvent(QShowEvent *event)  
  48. {  
  49.     updateTimer->start();  
  50.     currentValue = 0;  
  51. }  
  52.   
  53. void StorageDisplay::hideEvent(QHideEvent *event)  
  54. {  
  55.     if (updateTimer->isActive()) {  
  56.         updateTimer->stop();  
  57.     }  
  58.     currentValue = 0;  
  59. }  
  60.   
  61. void StorageDisplay::slotUpdateTimer()  
  62. {  
  63.     if (currentValue >= userdVaule) {  
  64.         updateTimer->stop();  
  65.         return;  
  66.     }  
  67.     currentValue++;  
  68.     update();  
  69. }  
  70.   
  71. void StorageDisplay::paintEvent(QPaintEvent *event)  
  72. {  
  73.   
  74.     QPainter painter(this);  
  75.     QColor usedColor(165, 220, 62);  
  76.     QColor freeColor(215, 215, 215);  
  77.     painter.drawPixmap(QRect((width() - backGround.width())/2 , (height() - backGround.height())/2, backGround.width(), backGround.height()) , backGround);  
  78.   
  79.     painter.translate(width() / 2, height() / 2);  
  80.     painter.setRenderHint(QPainter::Antialiasing);  
  81.     painter.setRenderHint(QPainter::SmoothPixmapTransform);  
  82.     painter.save();  
  83.     painter.rotate(42);  
  84.     painter.setPen(QPen(usedColor, 2));  
  85.     for (int i = 0; i < currentValue ; ++i) {  
  86.         painter.drawLine(0, 70, 0, 80);  
  87.         painter.rotate(2.8);  
  88.     }  
  89.     painter.setPen(QPen(freeColor, 3));  
  90.     for (int i = currentValue; i < 100 ; ++i) {  
  91.         painter.drawLine(0, 70, 0, 80);  
  92.         painter.rotate(2.8);  
  93.     }  
  94.     if (currentValue == 0) {  
  95.         dispayValueLabel->setFont(QFont("Arial", 12, QFont::Bold));  
  96.         dispayValueLabel->setText(tr("unconfig"));  
  97.     }  
  98.     else {  
  99.         dispayValueLabel->setFont(QFont("Arial", 15, QFont::Bold));  
  100.         dispayValueLabel->setText(tr("%1%").arg(currentValue));  
  101.     }  
  102.     QFontMetrics metrics(dispayValueLabel->font());  
  103.     int textwidth = metrics.width(dispayValueLabel->text());  
  104.     int textheight = metrics.height();  
  105.     dispayValueLabel->setGeometry((width() - textwidth)/2, (height() - textheight)/2 , textwidth, textheight);  
  106.     painter.restore();  
  107.   
  108.     painter.translate(-width()/2, -height()/2);  
  109.     painter.setBrush(QColor(233, 233, 233));  
  110.     painter.setPen(QPen(QColor(233, 233, 233), 15));  
  111.     painter.drawEllipse(QRectF((width()/2 - 55), (height()/2 - 55), 110, 110));  
  112.   
  113.     QConicalGradient conicalGradient(width()/2, height()/2, 90);  
  114.     conicalGradient.setColorAt(0, QColor(45, 204, 112));  
  115.     conicalGradient.setColorAt(1.0, QColor(51, 152, 219));  
  116.     painter.setPen(QPen(QBrush(conicalGradient), 30));  
  117.     painter.drawEllipse(QRectF((width()/2 - 35), (height()/2 - 35), 70, 70));  
  118.   
  119.     painter.setPen(Qt::NoPen);  
  120.     painter.setBrush(QColor(249, 249, 249));  
  121.     painter.drawEllipse(QRectF((width()/2 - 30), (height()/2 - 30), 60, 60));  
  122. }  
  123.   
  124. void StorageDisplay::resizeEvent(QResizeEvent *event)  
  125. {  
  126.     move((QApplication::desktop()->width() - width())/2,  (QApplication::desktop()->height() - height())/2);  
  127.     startValueLabel->setGeometry(35, 140, 25, 20);  
  128.     endValueLabel->setGeometry(97, 140, 50, 20);  
  129. }  
  130.   
  131. /****************move everywhere*******************/  
  132. void StorageDisplay::mousePressEvent(QMouseEvent *event)  
  133. {  
  134.     bPressFlag = true;  
  135.     beginDrag = event->pos();  
  136.     QWidget::mousePressEvent(event);  
  137. }  
  138.   
  139. void StorageDisplay::mouseMoveEvent(QMouseEvent *event)  
  140. {  
  141.     if (bPressFlag) {  
  142.         QPoint relaPos(QCursor::pos() - beginDrag);  
  143.         move(relaPos);  
  144.     }  
  145.     QWidget::mouseMoveEvent(event);  
  146. }  
  147.   
  148. void StorageDisplay::mouseReleaseEvent(QMouseEvent *event)  
  149. {  
  150.     bPressFlag = false;  
  151.     QWidget::mouseReleaseEvent(event);  
  152. }  

[html]  view plain  copy   Qt浅谈之三十九圆形进度条 Qt浅谈之三十九圆形进度条
  1. </pre><pre>  
(3)main.cpp
[html]  view plain  copy   Qt浅谈之三十九圆形进度条 Qt浅谈之三十九圆形进度条
  1. #include "widgetdisplay.h"  
  2. #include <QApplication>  
  3.   
  4. int main(int argc, char *argv[])  
  5. {  
  6.     QApplication a(argc, argv);  
  7.     StorageDisplay w;  
  8.     w.setUsedValue(100);  
  9.     w.show();  
  10.   
  11.     return a.exec();  
  12. }  
(4)编译运行
Qt浅谈之三十九圆形进度条Qt浅谈之三十九圆形进度条Qt浅谈之三十九圆形进度条Qt浅谈之三十九圆形进度条

三、总结

(1)若有问题或建议,请留言,在此感谢!


原文链接:http://blog.csdn.net/taiyang1987912/article/details/50524359