22 #include <QGridLayout>
26 #include "spinslider.h"
29 SpinSlider::SpinSlider( QString text, GROWTH_TYPE type, VALUE_TYPE dataType, qreal min, qreal max, QWidget* parent ) : QWidget( parent )
34 Q_ASSERT_X( min > 0.f ,
"SpinSlider" ,
"Real type value must larger than 0!!" );
39 mValueType = dataType;
43 QLabel* label =
new QLabel(text+
": ");
44 label->setFont( QFont(
"Helvetica", 10 ) );
46 mSlider =
new QSlider(Qt::Horizontal,
this);
47 mSlider->setMinimum( 0 );
48 mSlider->setMaximum( 100 );
49 mSlider->setMaximumWidth( 500 );
51 QGridLayout* layout =
new QGridLayout();
52 layout->setMargin( 2 );
53 layout->setSpacing( 2 );
55 layout->addWidget( label, 0, 0, 1, 1 );
56 layout->addWidget( mSlider, 1, 0, 1, 2 );
59 setSizePolicy( QSizePolicy::Preferred, QSizePolicy::Fixed );
61 connect( mSlider, &QSlider::valueChanged,
this, &SpinSlider::onSliderValueChanged );
64 void SpinSlider::changeValue(qreal value)
67 emit valueChanged( value );
70 void SpinSlider::onSliderValueChanged(
int v )
74 if ( mGrowthType == LINEAR )
76 value2 = mMin + v * ( mMax - mMin ) / mSlider->maximum();
78 else if ( mGrowthType == LOG )
80 value2 = mMin * std::exp( v * std::log( mMax / mMin ) / mSlider->maximum() );
82 else if ( mGrowthType == EXPONENT ) {
83 value2 = mMin + std::pow( v, mExp ) * ( mMax - mMin ) / std::pow( mSlider->maximum(), mExp );
85 changeValue( value2 );
88 void SpinSlider::setValue( qreal v )
92 if ( mGrowthType == LINEAR )
94 value2 = std::round( mSlider->maximum() * ( v - mMin ) / ( mMax - mMin ) );
96 else if ( mGrowthType == LOG )
98 value2 = std::round( std::log( v / mMin ) * mSlider->maximum() / std::log( mMax / mMin ) );
100 else if ( mGrowthType == EXPONENT )
102 value2 = std::round( std::pow( ( v - mMin ) * std::pow( mSlider->maximum(), mExp ) / ( mMax - mMin ), 1 / mExp ));
107 mSlider->setSliderPosition( value2 );
110 void SpinSlider::setPixelPos(qreal min, qreal max,
int val,
int space,
bool upsideDown)
112 mSlider->setSliderPosition(QStyle::sliderValueFromPosition(min, max, val,space, upsideDown));
115 void SpinSlider::setExponent(
const qreal exp )