首页 > Qt: 实现浮点slider和浮点spinbox

Qt: 实现浮点slider和浮点spinbox

Qt默认的QSlider和QSpinbox只能实现整数调整,不能实现浮点的变化,因此设计了如下可实现浮点变化的QFloatSlider和QFloatSpinner:

QFloatSlider.h

class QFloatSlider : public QSlider
{ Q_OBJECTpublic:QFloatSlider(QWidget* pParent = NULL);void setRange(double Min, double Max);void setMinimum(double Min);double minimum() const;void setMaximum(double Max);double maximum() const;double value() const;public slots:void setValue(int value);void setValue(double Value, bool BlockSignals = false);private slots:signals:void valueChanged(double Value);void rangeChanged(double Min, double Max);private:double	m_Multiplier;
};

QFloatSlider.cpp

QFloatSlider::QFloatSlider(QWidget* pParent /*= NULL*/) :QSlider(pParent),m_Multiplier(10000.0)
{ connect(this, SIGNAL(valueChanged(int)), this, SLOT(setValue(int)));setSingleStep(1);setOrientation(Qt::Horizontal);setFocusPolicy(Qt::NoFocus);
}void QFloatSlider::setValue(int Value)
{ emit valueChanged((double)Value / m_Multiplier);
}void QFloatSlider::setValue(double Value, bool BlockSignals)
{ QSlider::blockSignals(BlockSignals);QSlider::setValue(Value * m_Multiplier);if (!BlockSignals)emit valueChanged(Value);QSlider::blockSignals(false);
}void QFloatSlider::setRange(double Min, double Max)
{ QSlider::setRange(Min * m_Multiplier, Max * m_Multiplier);emit rangeChanged(Min, Max);
}void QFloatSlider::setMinimum(double Min)
{ QSlider::setMinimum(Min * m_Multiplier);emit rangeChanged(minimum(), maximum());
}double QFloatSlider::minimum() const
{ return QSlider::minimum() / m_Multiplier;
}void QFloatSlider::setMaximum(double Max)
{ QSlider::setMaximum(Max * m_Multiplier);emit rangeChanged(minimum(), maximum());
}double QFloatSlider::maximum() const
{ return QSlider::maximum() / m_Multiplier;
}double QFloatSlider::value() const
{ int Value = QSlider::value();return (double)Value / m_Multiplier;
}

QFloatSpinner.h

class QFloatSpinner : public QDoubleSpinBox
{ Q_OBJECTpublic:QFloatSpinner(QWidget* pParent = NULL);;virtual QSize sizeHint() const;void setValue(double Value, bool BlockSignals = false);
};
QSize QFloatSpinner::sizeHint() const
{ return QSize(90, 20);
}QFloatSpinner::QFloatSpinner(QWidget* pParent /*= NULL*/) :QDoubleSpinBox(pParent)
{ 
}void QFloatSpinner::setValue(double Value, bool BlockSignals)
{ blockSignals(BlockSignals);QDoubleSpinBox::setValue(Value);blockSignals(false);
}

更多相关:

  • 一、概述 之前的文章介绍过卡尔曼滤波算法进行定位,我们知道kalman算法适合用于线性的高斯分布的状态环境中,我们也介绍了EKF,来解决在非高斯和非线性环境下的机器人定位算法。但是他们在现实应用中存在计算量,内存消耗上不是很高效。这就引出了MCL算法。 粒子滤波很粗浅的说就是一开始在地图空间很均匀的撒一把粒子,然后通过获取机器人的...

  • 1.精度问题 由于是double类型,r=mid 而不是r=mid-12.如果首位两端(f(0)和f(100))同号,证明解不在[1,100]区间内 这是我之所以TE的原因,没有预先判断3.若在这个区间内,则一定可要求出解 所以binarysearch 返回m#include #include ...

  • 代理(Proxy)模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用。 代理模式的英文叫做Proxy或Surrogate,中文都可译成"代理"。所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 类图:...

  • 题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=41&page=show_problem&problem=1121 题意:给出两点坐标,用一条最短的线(曲线或者直线)连接起来,坐标系中原点处有一个半径为R的圆,连线不能...

  • 因为函数参数是按值传递的,所以要想改变变量,必须传递地址。 二级指针实际上就是指针变量的地址,如果传递二级指针,函数声明必须写**。 (void**)&必须是本质上就是指针变量的地址才可以做这样的转换,并不是说把一个一级指针也可以转换,void**的本质是标识一个二级指针。 &data就是(默认数据类型 **)&data,(void...

  • 文章目录1. 解决问题2. 应用场景3. 实现如下:C++实现C语言实现4. 缺点 1. 解决问题 在工厂方法模式中,我们卖衣服。此时我们为每一种衣服创建不同的工厂,帽子有一个工厂专门创建,裤子有一个工厂专门创建,T恤有一个工厂专门创建。这样的方式保证了代码设计的开闭原则(对扩展开发,对修改关闭),解决了简单工厂模式中暴露的...

  • 转载于:http://blog.csdn.net/u012819339/article/details/50654764   实体作品请参看优酷视频。 若以上链接点击无效请把该链接地址复制到浏览器地址栏 http://v.youku.com/v_show/id_XODYzODczNzQ4.html 说明: 该作品为arvik于2014...

  • - (void)viewDidLoad {[super viewDidLoad];NSLog(@"我在玩手机");NSLog(@"手机没电了");[self chargeMyIphone:^{NSLog(@"出门逛街");}];NSLog(@"我在看电视"); }-(void)chargeMyIphone:(void(^)(void...

  • http://stackoverflow.com/questions/150446/how-do-i-detect-when-someone-shakes-an-iphone 我的实现(基于Eran Talmor): 没必要application.applicationSupportsShakeToEdit = YES; Set th...