Qt之简单的滚动图

3 篇文章 0 订阅

最近学了一些简单的动态图,我觉得很有意思,废话不多说,直接看效果    

下面来看下代码

首先画横线部分(.h文件)


public:
    void paintEvent(QPaintEvent *);     //绘画事件的触发
    void setAttitude(float roll);       //时间戳的触发函数

private:
    float m_roll;                       //随时间动态值

这里我定义了两个函数,其实一个函数是绘画事件的必须函数。

然后就是CPP文件了

#include "DrawDirection.h"
#include "ui_DrawDirection.h"

#include <QPainter>
#include <QTimer>
#include <QDebug>

DrawDirection::DrawDirection(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::DrawDirection)
    , m_roll(0)
{
    ui->setupUi(this);

    QTimer *timer = new QTimer;
    connect(timer,&QTimer::timeout,[this](){
        setAttitude(m_roll + 1.0f);
        update();
    });
    timer->start(100);
}

DrawDirection::~DrawDirection()
{
    delete ui;
}

void DrawDirection::paintEvent(QPaintEvent *)
{
    QPainter painter(this);
    const QRect &rect = this->rect();
    int x = rect.x();
    int y = rect.y();
    int width = rect.width();
    int height = rect.height();
    const QPoint& center = rect.center();
    painter.fillRect(x,y, x + width,(y + height) /2,QColor(Qt::gray));
    painter.fillRect(x,(y+ height) / 2, x + width,(y + height) / 2,QColor(Qt::red));


    //画横线  定义一个开始点和一个重点,利用DrawLine 连接起来即可。(横线的高度相同,所以endPosY = startPosY)
    int startPosX = x + 70;
    int startPosY = y + 60;

    int endPosX = x + width - 70;
    int endPosY = startPosY;

    //这里画横线的颜色我用的是黄色线条,这里要设置一下
    painter.setPen(QPen(QColor(255,215,0),3));
    painter.drawLine(startPosX,startPosY,endPosX,endPosY);

    //画竖线
    int yaw = m_roll;
    const qreal size1 = yaw / 30;
    const qreal size2 = yaw % 30;
    int yaw1 = size1 * 30;
    qDebug()<<"yaw:"<<yaw ;
    qDebug()<<"size2:"<<size2 ;

    const int num = 7;
    const int pointY1 = y + 40;
    const int pointY2 = y + 55;
    const qreal avgleng = (endPosX - startPosX) * 1.0 / (num - 1); //计算每个竖线的间隔。
    const int moveX = size2 / 30 * avgleng;
    qDebug()<<"moveX:"<<moveX;
    const int left_x = startPosX - moveX;

    painter.setFont(QFont("宋体",20,1));
    int num_top = -90 + yaw1;
    for(int i = 0 ;i< 7;i++)
    {
        QPointF p1(left_x + avgleng * i,pointY1); //这里的left_x+avgleng*i代表每个竖线的X轴长度相等,竖线的位置随着i的变化而变化
        QPointF p2(left_x + avgleng * i,pointY2);
        painter.drawLine(p1,p2);

        if(num_top >= 360)
        {
            num_top = 0;
        }

        if(num_top < 0)
        {
            num_top += 360;
            painter.drawText(left_x + avgleng * i - 10,pointY1 - 10,QString::number(num_top));
        }
        else{
            painter.drawText(left_x + avgleng * i - 5,pointY1 - 10,QString::number(num_top));
        }

        num_top += 30;
    }
    painter.setPen(QPen(QColor(Qt::green),5));
    painter.drawText(center.x() - 5,startPosY + 30,QString::number(yaw));


}

void DrawDirection::setAttitude(float roll)
{
    m_roll = roll;
    if(m_roll > 360)
    {
        m_roll -= 360;
    }
}

代码里的30是我定义的间隔值。你们可以自主定义。效果是一样的。不理解的地方可以留言,我可以解答

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

古人云~开卷有益

老板的肯定就是我努力的方向

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

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

打赏作者

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

抵扣说明:

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

余额充值