转自:https://blog.csdn.net/lwbeyond/article/details/62969283
增加了滑动条控制功能,但是使用update()强制刷新界面后,电脑CPU达到25%,耗费大资源,未能解决!
.h文件
#ifndef WIDGET_H
#define WIDGET_H
#include
#include
namespace Ui {
class Widget;
}
class Widget : public QWidget
{
Q_OBJECT
public:
explicit Widget(QWidget *parent = 0);
~Widget();
void paintEvent(QPaintEvent *event);
public slots:
void set_angle();
private:
Ui::Widget *ui;
QPixmap pix_Needle;
int d_Pointer_angle_now;
QTimer *timer;
};
#endif // WIDGET_H
.cpp文件
/*
- 滑动条控制仪表指针扫动
- 增加了滑动条控制功能,但是使用update()强制刷新界面后,电脑CPU达到25%,耗费大资源,未能解决!
*/
#include “widget.h”
#include “ui_widget.h”
#include
#include
//设置表盘的中心
#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
Widget::Widget(QWidget *parent) :
QWidget(parent),
ui(new Ui::Widget)
{
ui->setupUi(this);
this->resize(400, 400); //开始显示的窗口大小
pix_Needle.load("C:\\Qt\\text\\text5\\image\\22.png");
d_Pointer_angle_now = Needle_MinAngle; //start angle
timer = new QTimer(this);
connect(timer,SIGNAL(timeout()),this,SLOT(update()));
//timer->start(10);
connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(set_angle()));
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *event)
{
//每次调用这个函数,改变角度值
//set_angle();
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
painter.setRenderHint(QPainter::SmoothPixmapTransform);
painter.drawPixmap(0,0,320,319,QPixmap("C:\\Qt\\text\\text4_3\\image\\11.png"));
//-----------------------------------------
painter.save();
//设置新的圆心,其实也是旋转中心
painter.translate(CenterPoint_X, CenterPoint_Y);
//旋转一个角度
painter.rotate( d_Pointer_angle_now );
qDebug() << "d_Pointer_angle_now::" << d_Pointer_angle_now;
//画指针,注意是在指针中心的反方向开始画
painter.drawPixmap(NeedleCenter_X, NeedleCenter_Y,
NeedlePic_W, NeedlePic_H,
pix_Needle);
//使原点复原
painter.restore();
//update(); //强制刷新
}
//测试函数,在最小与最大范围之间摆动
void Widget::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;
// }
int num = ui->horizontalSlider->value();
QString str = QString( "%1" ).arg( num );
d_Pointer_angle_now = str.toInt();
//每次改变的角度值
//d_Pointer_angle_now = d_Pointer_angle_now + iDirection * Needle_Step;
}