QT滚动数字

来源:互联网 发布:淘宝 厂家投诉 编辑:程序博客网 时间:2024/05/18 10:46
QT里没有找到数字滚动的控件,想实现数字滚动的效果之好自己实现。参考了http://blog.csdn.net/big_c_god/article/details/52452631废话不说了,贴代码头文件#ifndef VERTICALSCROLL_H#define VERTICALSCROLL_H#include <QWidget>#include <QPropertyAnimation>#include <QPainter>namespace Ui {class VerticalScroll;}class VerticalScroll : public QWidget{    Q_OBJECT    Q_PROPERTY(int deviation READ readDeviation WRITE setDeviation )public:    explicit VerticalScroll(QWidget *parent = 0);    ~VerticalScroll();    void setRange(double min, double max);    double readValue();protected:    double m_minRange;    double m_maxRange;    double m_currentValue;  //the select value    bool isDragging;    int m_deviation;        //偏移量    int m_mouseSrcPos;    int m_numSize;    QPropertyAnimation *homingAni;    const double interval;  //间隔大小    const int devide;    void mousePressEvent(QMouseEvent *);    void mouseMoveEvent(QMouseEvent *);    void mouseReleaseEvent(QMouseEvent *);    void paintEvent(QPaintEvent *);    void paintNum(QPainter &painter, double num, int deviation);    void homing();    int readDeviation();    void setDeviation(int n);signals:    void currentValueChanged(double value);    void deviationChange(double deviation);private:    Ui::VerticalScroll *ui;};#endif // VERTICALSCROLL_H源文件#include "verticalscroll.h"#include "ui_verticalscroll.h"#include <QMouseEvent>#include <QDebug>VerticalScroll::VerticalScroll(QWidget *parent) :    QWidget(parent),    ui(new Ui::VerticalScroll), m_minRange(0), m_maxRange(100),    m_currentValue(50), isDragging(0), m_deviation(0), m_numSize(9),    interval(0.5), devide(7){    ui->setupUi(this);    homingAni = new QPropertyAnimation(this, "deviation");    homingAni->setDuration(300);    homingAni->setEasingCurve(QEasingCurve::OutQuad);}VerticalScroll::~VerticalScroll(){    delete ui;}void VerticalScroll::setRange(double min, double max){    m_minRange = min;    m_maxRange = max;    if (m_currentValue < min)    {        m_currentValue = min;    }    if (m_currentValue > max)    {        m_currentValue = max;    }    m_numSize = 3;    int temp = m_maxRange;    while (temp>0)    {        temp /= 10;        m_numSize++;    }    repaint();}double VerticalScroll::readValue(){    return m_currentValue;}void VerticalScroll::mousePressEvent(QMouseEvent *e){    qDebug()<<"mouse pressed on vertical scroll";    homingAni->stop();    isDragging = 1;    m_mouseSrcPos = e->pos().y();    QWidget::mousePressEvent(e);}void VerticalScroll::mouseMoveEvent(QMouseEvent *e){    if (isDragging)    {        if ((m_currentValue == m_minRange && e->pos().y() >= m_mouseSrcPos) ||                ( m_currentValue == m_maxRange && e->pos().y() <= m_mouseSrcPos ))        {            return;        }        m_deviation = e->pos().y() - m_mouseSrcPos;        //若移动速度过快,则进行限制        if (m_deviation > (height() - 1) / devide)        {            m_deviation = (height() - 1) / devide;        }        else if (m_deviation < -(height() - 1) / devide)        {            m_deviation = -( height() - 1) / devide;        }        emit deviationChange((double)m_deviation / ((height() - 1) / devide));        repaint();    }}void VerticalScroll::mouseReleaseEvent(QMouseEvent *){    if (isDragging)    {        isDragging = 0;        homing();    }}void VerticalScroll::paintEvent(QPaintEvent *){    QPainter painter(this);    painter.setRenderHint(QPainter::Antialiasing, true);//    painter.drawPixmap(0,0,width(),height(),QPixmap(":/resource/number_background.png"));//    painter.drawPixmap(10, (height()-1)/5*2, width()-20, (height()-1)/5, QPixmap(":/resource/number_select.png"));//    painter.drawPixmap(50, 10, 55, 178, QPixmap(":/resource/number_indicator.png"));    //int Width = width() - 1;    int Height = height() - 1;    if ( m_deviation >= Height / devide && m_currentValue > m_minRange )    {        m_mouseSrcPos += Height / devide;        m_deviation -= Height / devide;        m_currentValue -= interval;    }    if ( m_deviation <= -Height / devide && m_currentValue < m_maxRange )    {        m_mouseSrcPos -= Height / devide;        m_deviation += Height / devide;        m_currentValue += interval;    }    //middle number    paintNum(painter, m_currentValue, m_deviation);    qDebug()<<"m_currentValue:"<<m_currentValue<<"m_deviation:"<<m_deviation;    //两侧数字1        if (m_currentValue != m_minRange)    {        qDebug()<<"1.1";        paintNum(painter, m_currentValue - interval, m_deviation - Height / devide);    }    if (m_currentValue != m_maxRange)    {        qDebug()<<"1.2";        paintNum(painter, m_currentValue + interval, m_deviation + Height / devide);    }//    //两侧数字2//    if (m_deviation >=0 && m_currentValue - interval * 2 >= m_minRange)//    {//        qDebug()<<"2.1";//        paintNum(painter, m_currentValue - interval * 2, m_deviation - Height / devide * 2);//    }//    if (m_deviation <= 0 && m_currentValue + interval * 2 <= m_maxRange)//    {//        qDebug()<<"2.2";//        paintNum(painter, m_currentValue + interval * 2, m_deviation + Height / devide * 2);//    }    for (int i=2; i <= devide/2; ++i)    {        if (m_currentValue - interval * i >= m_minRange)        {            qDebug()<<i<<".1";            paintNum(painter, m_currentValue - interval * i, m_deviation - Height / devide * i);        }        if (m_currentValue + interval * i <= m_maxRange)        {            qDebug()<<i<<".2";            paintNum(painter, m_currentValue + interval * i, m_deviation + Height / devide * i);        }    }}void VerticalScroll::paintNum(QPainter &painter, double num, int deviation){    int Width = width() - 1;    int Height = height() - 1;    int size = 28;//(Height - qAbs(deviation)) / m_numSize / 4.5;    int transparency = 255 - 255 * qAbs(deviation) / Height;    int height = Height / devide;    int y = Height / 2 + deviation - height / 2;    QFont font;    font.setPixelSize(size);    painter.setFont(font);    painter.setPen(QColor(2,255,2,transparency));    if ( y >= 0 && y + height < Height)    {        painter.drawRect(0, y, Width, height);        painter.drawText(QRectF(0, y, Width-20, height),                         Qt::AlignCenter,                         QString::number(num, 'f', 1));    }}void VerticalScroll::homing(){    if ( m_deviation > height() / 10)    {        homingAni->setStartValue( ( height() - 1 ) / 8 - m_deviation);        homingAni->setEndValue(0);        m_currentValue -= interval;    }    else if ( m_deviation > -height() / 10 )    {        homingAni->setStartValue(m_deviation);        homingAni->setEndValue(0);    }    else if ( m_deviation < -height() / 10 )    {        homingAni->setStartValue(-(height() - 1) / 8 - m_deviation);        homingAni->setEndValue(0);        m_currentValue += interval;    }    emit currentValueChanged(m_currentValue);    homingAni->start();}int VerticalScroll::readDeviation(){    return m_deviation;}void VerticalScroll::setDeviation(int n){    m_deviation = n;    repaint();}


0 0