| 
注册时间2010-2-1
阅读权限20
最后登录1970-1-1UID65325 以武会友  
 
 TA的每日心情|  | 郁闷 2017-1-19 11:18
 | 
|---|
 签到天数: 6 天 [LV.2]偶尔看看I | 
 
|  添加圆环。 这次应该比较全了,其他的背景图啥的贴个image等图片进去也好了,把这些就算都清清楚楚的写出来
 
 [AppleScript] 纯文本查看 复制代码 #ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include <QLabel>
#include <QMainWindow>
#include <QPainter>
#include <qtimer.h>
namespace Ui {
class MainWindow;
}
typedef enum tagDrawType
{
   Line = 1,
   Circle = 2
}DrawType;
class MainWindow : public QMainWindow
{
    Q_OBJECT
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void paintEvent(QPaintEvent *event);
    void DrawBkLine(QPainter* painter);
    void DrawBkCircle(QPainter* painter);
    void DrawBkCircle2(QPainter* painter);
    void gradientArc(QPainter *painter, int radius, double startAngle, int angleLength, int arcHeight, QRgb color);
public slots:
    void SetValue();
private:
    Ui::MainWindow *ui;
    QLabel    *l1;
    QLabel    *l2;
    QLabel    *l3;
    int u;
    QTimer   t;
};
#endif // MAINWINDOW_H
 [AppleScript] 纯文本查看 复制代码 #include "mainwindow.h"
#include "ui_mainwindow.h"
#include <math.h>
#include <QPainter>
#include <QLibrary>
//当前值
//最大刻度
const int nMax = 100;
//最小刻度
const int nMin = 0;
//旋转角度
const double nPercentRotate = 60;
//
const int nMaxRadus = 150;
const int nMinRadus = 100;
const int nDistance = 0;
//最外面的大圆
const int nDistance2 = 0;
//原点
 int nOrgXpos     = 0;
 int nOrgYpos     = 0;
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    u = 50;
    nOrgXpos = width() / 2;
    nOrgYpos = height() / 2;
    l1 = new QLabel(this);
    l1->setText(QString("%1%").arg(QString::number(u)));
    l1->move(nOrgXpos   ,nOrgYpos );
    l2 = new QLabel(this);
    l3 = new QLabel(this);
    //l2->setText(QString("Min0%"));
    //这个地方要注意
    //l2->move(nOrgXpos - nMinRadus, nOrgYpos + nMinRadus );
   // l3->setText(QString("Max100%"));
    //l3->move(nOrgXpos  + (nMinRadus ) , nOrgYpos +  (nMinRadus ) );
    t.setInterval(100);
    connect(&t, SIGNAL(timeout()), this, SLOT(SetValue( )));
    t.start();
}
MainWindow::~MainWindow()
{
    t.stop();
    delete ui;
}
void MainWindow::SetValue()
{
    if(u == nMax) {u = 0; };
    u++;
    l1->setText(QString("%1%").arg(QString::number(u)));
}
/**
     * 参数二:半径
     * 参数三:开始的角度
     * 参数四:指扫取的角度 - 顺时针
     * 参数五:圆环的高度
     * 参数六:填充色
**/
void MainWindow::gradientArc(QPainter *painter,
                             int radius,
                              double startAngle,
                               int angleLength,
                                int arcHeight,
                                 QRgb color)
{
 // 渐变色
    QRadialGradient gradient(0, 0, radius);
    gradient.setColorAt(0, Qt::white);
    gradient.setColorAt(1.0, color);
    painter->setBrush(gradient);
    QRectF rect(-radius, -radius, radius << 1, radius << 1);
    QPainterPath path;
    path.arcTo(rect, startAngle, angleLength);
    QPainterPath subPath;
    subPath.addEllipse(rect.adjusted(arcHeight, arcHeight, -arcHeight, -arcHeight));
    // path为扇形 subPath为椭圆
    path -= subPath;
    painter->setPen(Qt::darkBlue);
    painter->drawPath(path);
}
//圆环画法
void MainWindow::DrawBkCircle2(QPainter* painter)
{
    painter->save();
    painter->setRenderHint(QPainter::Antialiasing, true);
    // >> 1(右移1位)相当于width() / 2
    painter->translate(nOrgXpos + 2 * nMaxRadus, nOrgYpos );
    painter->setPen(QColor(122,122,77));
    int arcHeight = nMaxRadus - nMinRadus;
    double b = (360.0 / (nMax - nMin)); //根据实际最大最小值计算单位度数
    double a = u * b;
    gradientArc(painter, nMaxRadus,  0, 360 , arcHeight, qRgb(211, 40, 100));
    gradientArc(painter, nMaxRadus,  -0, -a, arcHeight, qRgb(22, 200, 10));
    painter->restore();;
    update();
}
//饼图
void MainWindow::DrawBkCircle(QPainter* painter)
{
    painter->save();
    painter->translate(nOrgXpos + 2 * nMaxRadus, nOrgYpos);
    painter->setRenderHint(QPainter::Antialiasing, true);
    //painter->translate(width() >> 1, height() >> 1);
    painter->setPen(QColor(122,122,77));
    int arcHeight = nMaxRadus - nMinRadus;
    double b = (360.0 / (nMax - nMin));
    double a = u * b;
    QRadialGradient gradient(0, 0, nMaxRadus);
    gradient.setColorAt(0, Qt::blue);
    gradient.setColorAt(1.0, QColor(55,222,122));
    painter->setBrush(gradient);
    QRectF rect_top(-nMaxRadus, -nMaxRadus, nMaxRadus << 1, nMaxRadus << 1);
    //乘以16是换算
    painter->drawPie(rect_top, 0 * 16, -a * 16);
    //painter.setPen(QColor(122,222,122));
    gradient.setColorAt(0, Qt::white);
    gradient.setColorAt(1.0, QColor(122,22,22));
    painter->setBrush(gradient);
    painter->drawPie(rect_top,  -a * 16, -(360-a) * 16);
    painter->restore();
    update();
}
//刻度盘
void MainWindow::DrawBkLine(QPainter* p)
{
    QColor use(112,222,121);
    QColor nouse(223,123,111);
    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 + 1 ; i <= nMax ; i++){
        p->drawLine(0,nMinRadus,0,nMaxRadus);
        p->rotate(nRotate);
    }
    p->restore();
    p->save();
    QPen pen(QColor(111,222,33));
    p->setPen(pen);
    p->drawEllipse(nOrgXpos - nMinRadus + nDistance/2  , nOrgYpos  - nMinRadus  + nDistance/2 , nMinRadus * 2 - nDistance , nMinRadus * 2 - nDistance );
    p->restore();
    pen.setColor(QColor(255,5,6));
    //pen.setWidth(26);
    p->setPen(pen);
    p->drawEllipse(nOrgXpos -  nMaxRadus - nDistance2/2  , nOrgYpos  -  nMaxRadus -  nDistance2/2 , nMaxRadus * 2 + nDistance2, nMaxRadus * 2 + nDistance2);
    p->restore();
    p->save();
    //表针的画法
    p->translate(nOrgXpos, nOrgYpos);
    pen.setColor(QColor(2,33,133));
   // pen.setWidth(0.1);
    p->setPen(pen);
    p->rotate(nPercentRotate);
    p->rotate(u * nRotate);
    p->drawLine(0, 0, 0, nMinRadus);
    p->restore();
    l1->setText(QString("%1%").arg(QString::number(u)));
    update();
}
void MainWindow::paintEvent(QPaintEvent *event)
{
   // setAttribute(Qt::WA_OpaquePaintEvent);
    QPixmap pixmap = QPixmap(size());
    pixmap.fill(this, 0, 0);
    QPainter painter(this);
    //painter.initFrom(this);
    DrawBkLine(&painter);
    DrawBkCircle(&painter);
    DrawBkCircle2(&painter);
    //painter.drawPixmap(0, 0, pixmap);
}
 
 
 
 | 
 评分
查看全部评分
 |