1. 首先准备素材,一个表盘,一个指针
2. 计算旋转圆心及转动角度
通过画图软件测量一下表盘中心的坐标,及指针中心的坐标
大概表盘的中心为(163,163),同样指针的中心位置为(14,110)
转动角度可以大概测量一下,应该为(-120,120)度
3. 转动操作
有了这些数据就可以来绘制表盘了
//设置表盘的中心
#define CenterPoint_X 163
#define CenterPoint_Y 163
//设置指针的中心,注意这里是负的,因为一会我们要平移坐标系
#define NeedleCenter_X -14 //
#define NeedleCenter_Y -110
//指针图片的宽度和高度
#define NeedlePic_W 28
#define NeedlePic_H 123
//指针可以活动的最小最大值
#define Needle_MinAngle -120
#define Needle_MaxAngle 120
//每一次Qt刷新,指针改变的的度数
#define Needle_Step 1
//初始化
SPDWidget::SPDWidget(QWidget *parent) :
QWidget(parent)
{
this->resize(320, 320);
pix_Needle.load("./res/style_1/needle.png");
d_Pointer_angle_now = Needle_MinAngle; //start angle
}
//画图
void SPDWidget::paintEvent(QPaintEvent *event)
{
//每次调用这个函数,改变角度值
set_angle();
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setRenderHint(QPainter::SmoothPixmapTransform);
//-----------------------------------------
painter.save();
//设置新的圆心,其实也是旋转中心
painter.translate(CenterPoint_X, CenterPoint_Y);
//旋转一个角度
painter.rotate(d_Pointer_angle_now);
//画指针,注意是在指针中心的反方向开始画
painter.drawPixmap(NeedleCenter_X, NeedleCenter_Y,
NeedlePic_W, NeedlePic_H,
pix_Needle);
//使原点复原
painter.restore();
}
//测试函数,在最小与最大范围之间摆动
void SPDWidget::set_angle()
{
static int iDirection = 1;
if (d_Pointer_angle_now >= Needle_MaxAngle)
{
iDirection = -1;
}
else if (d_Pointer_angle_now <= Needle_MinAngle)
{
iDirection = 1;
}
//每次改变的角度值
d_Pointer_angle_now = d_Pointer_angle_now + iDirection * Needle_Step;
}