30 #include "labeled_fslider.moc"
32 #define FLOAT_MULTIP 32768.0
33 #define TO_FLOAT(v) ((float)v / FLOAT_MULTIP)
34 #define TO_FIX(v) ((int)(v * FLOAT_MULTIP))
40 float min,
float max,
float step)
54 m_slider =
new QSlider(
this);
55 m_slider->setOrientation(Qt::Horizontal);
56 m_slider->setMinimum(imin);
57 m_slider->setMaximum(imax);
58 m_slider->setSingleStep(m_istep);
59 m_slider->setValue(imin);
61 m_spinb =
new QDoubleSpinBox(
this);
62 m_spinb->setMinimum(min);
63 m_spinb->setMaximum(max);
64 m_spinb->setSingleStep(m_fstep);
66 float tmp_step = m_fstep;
67 while (tmp_step < 1) {
70 if (decimals > 5)
break;
72 m_spinb->setDecimals(decimals);
73 m_spinb->setValue(max);
75 m_spinb->setMinimumWidth(m_spinb->sizeHint().width());
76 m_spinb->setAlignment(Qt::AlignRight);
77 m_spinb->setValue(min);
81 connect(m_spinb, SIGNAL(
valueChanged(
double)),
this, SLOT(syncValues(
double)));
82 connect(m_slider, SIGNAL(
valueChanged(
int)),
this, SLOT(syncValues(
int)));
83 connect(m_slider, SIGNAL(sliderReleased()),
this, SLOT(fixValue()));
98 m_spinb->setSuffix(text);
107 m_slider->setRange(imin, imax);
110 m_spinb->setRange(min, max);
121 m_slider->setSingleStep(m_istep);
122 m_spinb->setSingleStep(m_fstep);
125 float tmp_step = m_fstep;
126 while (tmp_step < 1) {
129 if (decimals > 5)
break;
131 m_spinb->setDecimals(decimals);
136 int ivalue =
TO_FIX(value);
138 if (((value - m_spinb->value()) > m_fstep) || ((m_spinb->value() -
value) > m_fstep)) {
139 m_spinb->setValue(value);
141 else if (ivalue != m_slider->value()) m_slider->setValue(ivalue);
144 void LabeledFSlider::syncValues(
int ivalue)
147 if (((value - m_spinb->value()) > m_fstep) || ((m_spinb->value() -
value) > m_fstep)) {
148 m_spinb->setValue(value);
150 else if (ivalue != m_slider->value())m_slider->setValue(ivalue);
154 void LabeledFSlider::syncValues(
double value)
156 int ivalue =
TO_FIX(value);
157 if (((value - m_spinb->value()) > m_fstep) || ((m_spinb->value() -
value) > m_fstep)) {
158 m_spinb->setValue(value);
160 else if (ivalue != m_slider->value())m_slider->setValue(ivalue);
164 void LabeledFSlider::fixValue()
167 int rest = (m_slider->value() - m_slider->minimum())%m_istep;
170 if (rest > (m_istep/2)) m_slider->setValue(m_slider->value()+(m_istep-rest));
171 else m_slider->setValue(m_slider->value()-rest);
172 m_spinb->setValue(
TO_FLOAT(m_slider->value()));
LabeledFSlider(QWidget *parent, const QString &text, float min, float max, float st)
Create the slider.
void setValue(float)
Set the slider/spinbox value.
void setSuffix(const QString &text)
Set the unit.
void valueChanged(float)
Emit the slider value changes.
void setRange(float, float)