通过重绘去实现速度码表的实现
1.准备两个图片,一个是码表,一个是速度的指向指针,通过旋转指针图片去实现角度的旋转。
2.通过horizontalSlider水平进度条去改变角度,通过角度的处理转换成速度的对应值。
代码如下:
widget.cpp
#include "widget.h"
#include "ui_widget.h"
#include <QPainter>
Widget::Widget(QWidget *parent)
: QWidget(parent)
, ui(new Ui::Widget)
{
ui->setupUi(this);
//设置水平进度条的最大值与最小值,即指针图层允许旋转的最大角度与最小角度
ui->horSlider->setMaximum(278);
ui->horSlider->setMinimum(0);
this->angle=0; //初始化角度
this->speed=0; //初始化速度值
connect(ui->horSlider,SIGNAL(valueChanged(int )),this,SLOT(horSliderValChangedSlotFun(int )));
//处理进度条的信号,即建立联系
}
Widget::~Widget()
{
delete ui;
}
void Widget::paintEvent(QPaintEvent *)
{
QPainter p(this);
p.translate(this->width()/2,this->height()/2); //坐标轴平移
//码表,不允许旋转
QPixmap pix(":/speedpan.png");
p.drawPixmap(-80,-80,160,160,pix);
//旋转指针对齐码表0刻度
p.rotate(130);
//旋转角度同步值指针,即指针应当存在旋转
p.rotate(this->angle);
//角度转换为速度的对应值处理
speed=(int)(angle/2.78);
//指针
QPixmap pix1(":/speedcloock.png");
p.drawPixmap(-10,-10,70,20,pix1);
//抗锯齿
p.setRenderHint(QPainter::Antialiasing);
//对应角度与速度的值得显示
QString angle1 = QString("%1").arg(angle);
ui->lineEditAngle->setText(angle1);
QString speed1 = QString("%1").arg(speed);
ui->lineEditSpeed->setText(speed1);
/* p.rotate(120); //坐标轴旋转
* void QPainter::rotate(qreal angle)
Rotates the coordinate system clockwise. The given angle parameter is in degrees.
See also setWorldTransform() and Coordinate Transformations.
*/
//p.rotate(-30);
/*
QBrush brush; brush.setColor(QColor(255,255,0)); brush.setStyle(Qt::SolidPattern);
p.setBrush(brush);
p.drawEllipse(-13,-15,25,25);
*/
/*
* QPen pen; pen.setWidth(2); pen.setColor(QColor(255,255,0));
* p.setPen(pen);
*
QPen pen; pen.setWidth(2); pen.setColor(QColor(0,255,0));
p.setPen(pen);
void QPainter::drawPixmap(int x, int y, int w, int h, const QPixmap &pm,int sx, int sy, int sw, int sh){
drawPixmap(QRectF(x, y, w, h), pm, QRectF(sx, sy, sw, sh));
}
p.drawLine(0,0,80,80);
QPen pen1; pen1.setWidth(4); pen1.setColor(QColor(255,0,0));
p.setPen(pen1);
p.drawPoint(0,0);
p.rotate(this->angle);
// p.drawEllipse(-50,-50,100,100);
p.drawLine(0,0,100,0);
*/
}
void Widget::horSliderValChangedSlotFun(int angle)
{
this->angle= angle;
this->speed = speed;
update(); //请求要求 整个窗体重绘,那么 paintEvent就会被调用
}
widget.h
//重写该函数,绘制自己的东西
void paintEvent(QPaintEvent *event);
public slots:
void horSliderValChangedSlotFun(int);
private:
Ui::Widget *ui;
int angle; //角度全局变量
double speed; //速度全局变量
效果图如下: