komany 发表于 2017-1-19 11:09:03

授人以鱼不如授人以渔-QT圆形刻度盘或者进度条各种计算公式

网上从来都是现成的,没有找到过具体的计算公式,下面是我动手琢磨出来的,如果有问题还请指教!{:tongue:}
注释还是看不懂的贴到QT CREATOR里面一目了然



#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QLabel>
#include <QMainWindow>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void paintEvent(QPaintEvent *event);
private:
    Ui::MainWindow *ui;
    QLabel    *l1;
    QLabel    *l2;
    QLabel    *l3;
};

#endif // MAINWINDOW_H


#include "mainwindow.h"
#include "ui_mainwindow.h"

#include <QPainter>
//当前值
const int u =43;
//最大刻度
const int nMax = 100;
//最小刻度
const int nMin = 0;
//旋转角度
const double nPercentRotate = 40;
//
const int nMaxRadus = 200;

const int nMinRadus = 150;

const int nDistance = 50;
//最外面的大圆
const int nDistance2 = 70;
//原点
int nOrgXpos   = 0;
int nOrgYpos   = 0;

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    nOrgXpos = width() / 2;

    nOrgYpos = height() / 2;

    l1 = new QLabel(this);

    l1->setText(QString("44"));

    l1->move(nOrgXpos   ,nOrgYpos );

    l2 = new QLabel(this);

    l3 = new QLabel(this);

    l2->setText(QString("Min"));
    //这个地方要注意
    l2->move(nOrgXpos - nMinRadus, nOrgYpos + nMinRadus );

    l3->setText(QString("Max"));

    l3->move(nOrgXpos+ (nMinRadus ) , nOrgYpos +(nMinRadus ) );



}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::paintEvent(QPaintEvent *event)
{
    QColor use(112,222,121);
    QColor nouse(223,123,111);
    QPainter p(this);
    double nRotate = (360.0 - 2 * nPercentRotate) / (nMax - nMin);
    p.setRenderHint(QPainter::Antialiasing);
    p.setRenderHint(QPainter::SmoothPixmapTransform);

    p.save();
    p.translate(nOrgXpos, nOrgYpos);
    p.rotate(nPercentRotate);
    p.setPen(use);
    for(int i = 0 ; i < u; i++){

      p.drawLine(0,nMinRadus,0,nMaxRadus);
      p.rotate(nRotate);
    }
    p.setPen(nouse);
    for(int i = u ; i < nMax ; i++){

      p.drawLine(0,nMinRadus,0,nMaxRadus);
      p.rotate(nRotate);
    }
    p.restore();

    p.setPen(QColor(11,22,33));
    p.drawEllipse(nOrgXpos - nMinRadus + nDistance/2, nOrgYpos- nMinRadus+ nDistance/2   , nMinRadus * 2 - nDistance , nMinRadus * 2 - nDistance );

    p.restore();
    p.setPen(QColor(11,22,33));
    p.drawEllipse(nOrgXpos -nMaxRadus - nDistance2/2, nOrgYpos-nMaxRadus -nDistance2/2 , nMaxRadus * 2 + nDistance2, nMaxRadus * 2 + nDistance2);
}

zeknight 发表于 2017-1-19 12:50:24

看不懂,顶一个,太厉害了!

PYG官方论坛 发表于 2017-1-19 13:03:23

感谢分享 ~

komany 发表于 2017-1-19 13:07:38

上传工程文件,qt 5.7.1 vs2013         加了 表针可以 还可以走!

雀巢咖啡 发表于 2017-1-23 23:29:07

权限不够,看不了更多。但是,代码使用的字体很好看。不知道叫什么名字?

yezjx 发表于 2017-1-27 13:53:19

支持楼主!!!

方勇638789 发表于 2017-3-10 06:46:37

完全不明白!!!!感觉好厉害的样子
页: [1]
查看完整版本: 授人以鱼不如授人以渔-QT圆形刻度盘或者进度条各种计算公式