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