qt制作刻度条(可用作时间及其他刻度)实现缩放,以及平移

这段时间一直想做一个刻度条,用于项目开发,但是始终没找到一个方法。最后通过苦思冥想,到动手实践,终于算是实现这个功能了,
看代码:
.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QMap>

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

protected:
    void paintEvent(QPaintEvent *event);

    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);
    void mouseReleaseEvent(QMouseEvent *event);

    void wheelEvent(QWheelEvent *event);

private:
    QList<QRect> rectList;

    int showSize=20;  //页面显示20位
    float scale=1;

    QPoint m_clickPoint;
    bool m_bClick=false;
};
#endif // WIDGET_H

.cpp

#include "widget.h"
#include <QPainter>
#include <QMouseEvent>
#include <qdebug.h>
#include <QWheelEvent>

Widget::Widget(QWidget *parent)
    : QWidget(parent)
{
    this->resize(800,600);
    int k=0;
    int i_size=(this->width()/showSize);
    for(int i=0;i<100;i++)  //创建100个数字
    {
        QRect rect(k,0,0.1,10);
        rectList.append(rect);
        k=k+i_size;
    }
}

Widget::~Widget()
{
}

void Widget::paintEvent(QPaintEvent *event)
{
    QPainter painter(this);
    int K=0;  //设置值显示的位置
    for(int i=0;i<rectList.size();i++)
    {
        float value = round(showSize+(i-showSize)*scale);
        if(value<0||value>100)  //100和0分别为最大值和最小值
        {
            continue ;
        }

        painter.drawRect(rectList[K]);

        QString strValue = tr("%1").arg(value);
        int fontWidth = fontMetrics().width(strValue)/2;
        painter.drawText(QPointF(rectList[K].x()-fontWidth,7+15),strValue);

        K++;


//        painter.drawRect(rectList[i]);

//        QString strValue = tr("%1").arg(value);
//        int fontWidth = fontMetrics().width(strValue)/2;
//        painter.drawText(QPointF(rectList[i].x()-fontWidth,7+15),strValue);


    }

}

void Widget::mousePressEvent(QMouseEvent *event)
{
    m_clickPoint=event->pos();
    m_bClick=true;

}

void Widget::mouseMoveEvent(QMouseEvent *event)
{
    if(m_bClick&&event->buttons()==Qt::LeftButton)
    {
        for(int i=0;i<rectList.size();i++)
        {
            int i_x=rectList[i].x();
            rectList[i].setX(event->pos().x()-m_clickPoint.x()+i_x);
            rectList[i].setWidth(0.1);
        }
        m_clickPoint=event->pos();
        update();

    }
}

void Widget::mouseReleaseEvent(QMouseEvent *event)
{
    m_bClick=false;
}

void Widget::wheelEvent(QWheelEvent *event)
{
    qDebug()<<"event::"<<event->delta();
    if(event->delta()>0)
    {
        //放大
        scale=scale-0.2;
        if(scale<1)
        {
            scale=1;
        }
    }
    else
    {
        //缩小
        scale=scale+0.2;
    }
    update();
}


基本的注释代码中都有,
看下运行效果:
在这里插入图片描述
图片不太清楚。
有什么不懂可以问。
觉得有用可以给博主点个赞
ヾ( ̄▽ ̄)ByeBye

  • 9
    点赞
  • 31
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

加油吧,小杜

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

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

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

打赏作者

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

抵扣说明:

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

余额充值