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
- QT滚动数字
- 数字滚动
- QT 字幕滚动(左右滚动)
- js 数字滚动 动画
- android 数字滚动
- Android数字纵向滚动
- jquery数字滚动
- ScrollNumber 数字滚动
- RollNum ,滚动数字
- 数字滚动效果
- 【特效】滚动的数字
- jQuery实现数字滚动
- 数字滚动特效
- 滚动的数字
- Qt滚动效果
- qt隐藏滚动条
- Qt关于滚动条
- Qt 滚动区
- C语言如何获得精确到毫秒的时间
- Windows下编译MySQL
- 华为oj初级 表示数字
- linux系统一个tomcat配置两个域名,每个域名对应一个项目
- 死锁例子
- QT滚动数字
- 内核3.x版本之后设备树(device tree)机制
- JPA 之 深入浅出 --概述讲解
- 对整型数用printf %f输出的话,就会变成0.0000 不管整型数是多少
- 一个小公司怎么实现APP的UI自动化测试
- 工资计算
- Android 使用Android Studio + Gradle 或 命令行 进行apk签名打包
- 自动安装pkg的依赖包
- Android依赖管理与私服搭建