第一步画定点三角形
第二步画背景大圆
第三步画背小圆
第四步画旋转的棍子
第五步画刻度
加了抗锯齿比原来的好看些
1、使用方法:动态创建
MySpinButton Spin_button = new MySpinButton(this);
Spin_button->resize (200, 200);
Spin_button->move (350, 200);
Spin_button->show();
2、MySpinButton.h
#ifndef MYSPINBUTTON_H
#define MYSPINBUTTON_H
#include <QWidget>
#define whirlbuttonHeigth 130
#define whirlbuttonWidth 120
class MySpinButton : public QWidget
{
Q_OBJECT
public:
void paintEvent(QPaintEvent *event);
explicit MySpinButton(QWidget *parent = nullptr);
~MySpinButton();
void setDegree(int deg);
int getDegree();
signals:
void updateDegree();
protected:
void mousePressEvent(QMouseEvent *event);
void mouseMoveEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
void mouseToPosion(QMouseEvent *event);
QSize sizeHint() const;
QSize minimumSizeHint() const;
private:
int degree;
};
#endif // MYSPINBUTTON_H
3、MySpinButton.cpp
#include "myspinbutton.h"
#include <QPainter>
#include <QMouseEvent>
#include <math.h>
MySpinButton::MySpinButton(QWidget *parent) : QWidget(parent)
{
setSizePolicy(QSizePolicy::Minimum,QSizePolicy::Minimum);
degree = 90;
}
MySpinButton::~MySpinButton()
{
}
void MySpinButton::setDegree(int deg)
{
this->degree = deg;
this->update();
}
void MySpinButton::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
//反走样
painter.setRenderHints(QPainter::Antialiasing | QPainter::TextAntialiasing);
QTransform tranform1;
int originY = whirlbuttonHeigth/2;
int originX = whirlbuttonWidth/2;
const int triangle[3][2] =
{
{ originX-2, 0 },
{ originX+2, 0 },
{ originX, 7 }
};
painter.setPen(QPen(Qt::red));
painter.setBrush(QBrush(Qt::red));
//绘制多边形,三角形。
painter.drawPolygon(QPolygon(3, &triangle[0][0]));
tranform1.translate(originX,originY);
tranform1.rotate(degree);
tranform1.translate(-(originX),-(originY));
painter.setWorldTransform(tranform1);
QPen thickPen(palette().foreground(), 1.5);
QPen midPen(palette().foreground(), 1.0);
QPen thinPen(palette().foreground(), 0.5);
QColor niceBlue(150, 150, 200);
painter.setPen(thinPen);
//随着程度逐渐改变
QConicalGradient coneGradient(originX, originY, -90.0);
coneGradient.setColorAt(0.0, Qt::darkGray);
coneGradient.setColorAt(0.2, niceBlue);
coneGradient.setColorAt(1.0, Qt::white);
coneGradient.setColorAt(1.0, Qt::darkGray);
unsigned r = 56;
painter.setBrush(coneGradient);
painter.drawEllipse((originX-r), (originY-r), r*2, r*2);
r = 24;
QRadialGradient haloGradient(originX, originY, r, originX, originY);
haloGradient.setColorAt(0.0, Qt::lightGray);
haloGradient.setColorAt(0.8, Qt::darkGray);
haloGradient.setColorAt(0.9, Qt::white);
haloGradient.setColorAt(1.0, Qt::black);
painter.setPen(Qt::NoPen);
painter.setBrush(haloGradient);
painter.drawEllipse(originX-r, originY-r, r*2, 2*r);
unsigned rx = 30,ry = 8;
QLinearGradient knobGradient(originX-rx, originY-ry,originX-rx, originY+ry);
knobGradient.setColorAt(0.0, Qt::black);
knobGradient.setColorAt(0.2, niceBlue);
knobGradient.setColorAt(0.3, Qt::lightGray);
knobGradient.setColorAt(0.8, Qt::white);
knobGradient.setColorAt(1.0, Qt::black);
painter.setBrush(knobGradient);
painter.setPen(thinPen);
painter.drawRoundRect(originX-rx,originY-ry, rx*2, ry*2, 49, 99);
for (int i = 0; i < 36; ++i)
{
if (i%6)
{
painter.setPen(midPen);
painter.drawLine(5,originY, 10,originY);
}
else
{
painter.setPen(thickPen);
painter.drawLine(5,originY, 13,originY);
tranform1.translate(25,originY);
tranform1.rotate(-90);
tranform1.translate(-25,-originY);
painter.setWorldTransform(tranform1);
painter.drawText(22, originY,QString::number(i/6));
tranform1.translate(25,originY);
tranform1.rotate(90);
tranform1.translate(-25,-originY);
painter.setWorldTransform(tranform1);
}
tranform1.translate(originX,originY);
tranform1.rotate(-10);
tranform1.translate(-originX,-originY);
painter.setWorldTransform(tranform1);
}
}
QSize MySpinButton::sizeHint() const
{
QSize size = QSize(whirlbuttonHeigth,whirlbuttonWidth);
return size;
}
QSize MySpinButton::minimumSizeHint() const
{
QSize size = QSize(whirlbuttonHeigth,whirlbuttonWidth);
return size;
}
void MySpinButton::mousePressEvent(QMouseEvent *event)
{
mouseToPosion(event);
this->update();
}
int MySpinButton :: getDegree()
{
return(degree);
}
void MySpinButton::mouseMoveEvent(QMouseEvent * event)
{
mouseToPosion(event);
this->update();
}
void MySpinButton::mouseReleaseEvent(QMouseEvent * event)
{
mouseToPosion(event);
this->updateDegree();
}
void MySpinButton:: mouseToPosion(QMouseEvent * event)
{
QPoint currentPoint = event->pos();
double pi = 3.1415927;
double x = currentPoint.x() - whirlbuttonHeigth/2;
double y = currentPoint.y() - whirlbuttonWidth/2;
if((x ==0)&&(y<=0))
degree = 90;
else if((x==0)&&(y>0))
degree = 270;
else if(x>0)
degree = atan(y/x)*180/pi + 180;
else if(y>0)
degree = atan(y/x)*180/pi + 360;
else
degree = atan(y/x)*180/pi;
}