• 6322阅读
  • 3回复

授人以鱼不如授人以渔-圆形刻度盘或者进度条各种计算公式 [复制链接]

上一主题 下一主题
离线komany
 

图酷模式  只看楼主 倒序阅读 楼主  发表于: 2017-01-19
  1. 网上实在找不到计算公式,下面是我动手制作过程中摸索出来的,不准的地方望海涵,有了这公式,刻度盘,进度条随你搞,哈哈哈哈!
  2. 遇到事情还是要多动手!!!
  3. #ifndef MAINWINDOW_H
  4. #define MAINWINDOW_H
  5. #include <QLabel>
  6. #include <QMainWindow>
  7. namespace Ui {
  8. class MainWindow;
  9. }
  10. class MainWindow : public QMainWindow
  11. {
  12.     Q_OBJECT
  13. public:
  14.     explicit MainWindow(QWidget *parent = 0);
  15.     ~MainWindow();
  16.     void paintEvent(QPaintEvent *event);
  17. private:
  18.     Ui::MainWindow *ui;
  19.     QLabel    *l1;
  20.     QLabel    *l2;
  21.     QLabel    *l3;
  22. };
  23. #endif // MAINWINDOW_H

  1. #include "mainwindow.h"
  2. #include "ui_mainwindow.h"
  3. #include <QPainter>
  4. //当前值
  5. const int u =43;
  6. //最大刻度
  7. const int nMax = 100;
  8. //最小刻度
  9. const int nMin = 0;
  10. //旋转角度
  11. const double nPercentRotate = 40;
  12. //
  13. const int nMaxRadus = 200;
  14. const int nMinRadus = 150;
  15. const int nDistance = 50;
  16. //最外面的大圆
  17. const int nDistance2 = 70;
  18. //原点
  19. int nOrgXpos     = 0;
  20. int nOrgYpos     = 0;
  21. MainWindow::MainWindow(QWidget *parent) :
  22.     QMainWindow(parent),
  23.     ui(new Ui::MainWindow)
  24. {
  25.     ui->setupUi(this);
  26.     nOrgXpos = width() / 2;
  27.     nOrgYpos = height() / 2;
  28.     l1 = new QLabel(this);
  29.     l1->setText(QString("44"));
  30.     l1->move(nOrgXpos   ,nOrgYpos );
  31.     l2 = new QLabel(this);
  32.     l3 = new QLabel(this);
  33.     l2->setText(QString("Min"));
  34.     //这个地方要注意
  35.     l2->move(nOrgXpos - nMinRadus, nOrgYpos + nMinRadus );
  36.     l3->setText(QString("Max"));
  37.     l3->move(nOrgXpos  + (nMinRadus ) , nOrgYpos +  (nMinRadus ) );
  38. }
  39. MainWindow::~MainWindow()
  40. {
  41.     delete ui;
  42. }
  43. void MainWindow::paintEvent(QPaintEvent *event)
  44. {
  45.     QColor use(112,222,121);
  46.     QColor nouse(223,123,111);
  47.     QPainter p(this);
  48.     double nRotate = (360.0 - 2 * nPercentRotate) / (nMax - nMin);
  49.     p.setRenderHint(QPainter::Antialiasing);
  50.     p.setRenderHint(QPainter::SmoothPixmapTransform);
  51.     p.save();
  52.     p.translate(nOrgXpos, nOrgYpos);
  53.     p.rotate(nPercentRotate);
  54.     p.setPen(use);
  55.     for(int i = 0 ; i < u; i++){
  56.         p.drawLine(0,nMinRadus,0,nMaxRadus);
  57.         p.rotate(nRotate);
  58.     }
  59.     p.setPen(nouse);
  60.     for(int i = u ; i < nMax ; i++){
  61.         p.drawLine(0,nMinRadus,0,nMaxRadus);
  62.         p.rotate(nRotate);
  63.     }
  64.     p.restore();
  65.     p.setPen(QColor(11,22,33));
  66.     p.drawEllipse(nOrgXpos - nMinRadus + nDistance/2  , nOrgYpos  - nMinRadus  + nDistance/2   , nMinRadus * 2 - nDistance , nMinRadus * 2 - nDistance );
  67.     p.restore();
  68.     p.setPen(QColor(11,22,33));
  69.     p.drawEllipse(nOrgXpos -  nMaxRadus - nDistance2/2  , nOrgYpos  -  nMaxRadus -  nDistance2/2 , nMaxRadus * 2 + nDistance2, nMaxRadus * 2 + nDistance2);
  70. }



离线liudianwu

只看该作者 1楼 发表于: 2017-01-19
嗯,挺好,挺到位!
欢迎关注微信公众号:Qt实战/Qt入门和进阶(各种开源作品、经验整理、项目实战技巧,专注Qt/C++软件开发,视频监控、物联网、工业控制、嵌入式软件、国产化系统应用软件开发) QQ:517216493  WX:feiyangqingyun  QQ群:751439350
离线boylebao

只看该作者 2楼 发表于: 2017-01-19
为Qt打造具有强大生产力的软件。
离线liuqiaoping

只看该作者 3楼 发表于: 2022-04-01
平台上第一个可以运行的代码,呜呜呜~
快速回复
限100 字节
 
上一个 下一个