目录
一个自定义滚动数字
QT滚动数字 滚动选择器 滑动选择器 支持循环
效果如下,没有做样式美化,参考的其他博文,站在巨人的肩膀上,做了一点改动,仅作为一个参考
动态效果
参考博客
【QT】自制控件---滚动选择器_qt滚动选择时间控件-CSDN博客
主要实现代码
头文件
新增一个变量,用于记录最大值与最小值之间的范围
int m_rangeSpan;
源文件
代码太多,这里只贴一下改动的地方
RollingBox::RollingBox(QWidget *parent) :
QWidget(parent),m_minRange(0),m_maxRange(10),
m_rangeSpan(m_maxRange-m_minRange+1),
m_currentValue(5),isDragging(0),m_deviation(0),m_numSize(6)
{
homingAni = new QPropertyAnimation(this,"deviation");//动画用于将选中数字归到中间位置
homingAni->setDuration(300);
homingAni->setEasingCurve(QEasingCurve::OutQuad);
}
void RollingBox::mouseMoveEvent(QMouseEvent *e)
{
if(isDragging)
{
//数值到边界时,阻止继续往对应方向移动
// if((m_currentValue == m_minRange && e->pos().x() >= m_mouseSrcPos)||
// (m_currentValue == m_maxRange && e->pos().x() <= m_mouseSrcPos))
// return;
m_deviation = e->pos().x() - m_mouseSrcPos;
//若移动速度过快时进行限制
if(m_deviation > (width()-1)/4)
m_deviation = (width()-1)/4;
else if(m_deviation < -(width()-1)/4)
m_deviation = -(width()-1)/4;
emit deviationChange((float)m_deviation/((width()-1)/4));
repaint();
}
}
void RollingBox::paintEvent(QPaintEvent *)
{
QPainter painter(this);
painter.setRenderHint(QPainter::Antialiasing, true);
int Width = width()-1;
int Height = height()-1;
//计算当前中心数字,及位置
if(m_deviation >= Width/4)
{
m_mouseSrcPos += Width/4;
m_deviation -= Width/4;
m_currentValue -= 1;
}
if(m_deviation <= -Width/4)
{
m_mouseSrcPos -= Width/4;
m_deviation += Width/4;
m_currentValue += 1;
}
//中间数字
paintNum(painter,calculateLoopNum(m_currentValue),m_deviation);
//两侧数字1
paintNum(painter,calculateLoopNum(m_currentValue-1),m_deviation-Width/4);
paintNum(painter,calculateLoopNum(m_currentValue+1),m_deviation+Width/4);
//两侧数字2
if(m_deviation >= 0)
paintNum(painter,calculateLoopNum(m_currentValue-2),m_deviation-Width/2);
if(m_deviation <= 0)
paintNum(painter,calculateLoopNum(m_currentValue+2),m_deviation+Width/2);
//边框
painter.setPen(QPen(QColor(0,0,0,120),2));
painter.drawLine(Width/8*3,0,Width/8*3,Height);
painter.drawLine(Width/8*5,0,Width/8*5,Height);
}
int RollingBox::calculateLoopNum(int num)
{
while (num < m_minRange) num += m_rangeSpan;
while (num > m_maxRange) num -= m_rangeSpan;
return num;
}
鼠标滚动实现
增加鼠标滚轮事件,可以支持鼠标滚动调整数值
//头文件
void wheelEvent(QWheelEvent *);
//源文件
void RollingBox::wheelEvent(QWheelEvent *event)
{
qDebug() << event->angleDelta();
m_deviation = width() / 8 + 1;
if (event->angleDelta().y() > 0)
m_deviation = 0 - m_deviation;
homing();
}
总结
一个小demo
需要完整代码,这里发布了一个0积分资源,刚发,可能还没有通过,下载不了,等审核之后就可以下载了
鼠标滚动是后来更新的,代码里没有支持,可自己加上即可