QT简易速度表动态的实现

通过重绘去实现速度码表的实现
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;      //速度全局变量

效果图如下:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

努力做最好的

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值