PDA

View Full Version : Use user-specifying QSlider step !



jiapei100
16th July 2013, 15:04
Hi, all:

Another naive question.

I'm using Ubuntu 12.10+Qt Creator 2.5.2 Based on Qt 4.8.2 (32 bit)
I'm trying to design a slider with interval 2, starting from 1 and ending in 9.
Namely, I hope the possible values obtained while I'm dragging the slider are:
1, 3, 5, 7, 9 (all odd numbers)

And, my code in the produced ui file is copied as follows:

horizontalSlider_aperturesize = new QSlider(edgedetectiondialog_laplacian);
horizontalSlider_aperturesize->setObjectName(QString::fromUtf8("horizontalSlider_aperturesize"));
horizontalSlider_aperturesize->setGeometry(QRect(150, 20, 180, 30));
horizontalSlider_aperturesize->setMinimum(1);
horizontalSlider_aperturesize->setMaximum(9);
horizontalSlider_aperturesize->setSingleStep(2);
horizontalSlider_aperturesize->setPageStep(3);
horizontalSlider_aperturesize->setValue(3);
horizontalSlider_aperturesize->setOrientation(Qt::Horizontal);
horizontalSlider_aperturesize->setTickPosition(QSlider::TicksBelow);
horizontalSlider_aperturesize->setTickInterval(2);


I really can't see anything wrong, but my later-on code went wrong because I got 4 from the slider reading (obviously, this is an even number, which is out of my expectation.)


Any suggestions on how to avoid such mistakes?


Thank you very much.


Best Regards
Pei

anda_skoa
20th July 2013, 17:56
The steps (both single and page) are delta values that are used when a slider is modified by clicking on either side of the handle or by using keyboard keys (cursor keys, page up/down).
They do not change in any way the sliders ability to be dragged into any position within its range.

You want a slider that can have five different values, so you create a slider that has a range that only contains five values, e.g. 0 to 4.
Then you map the slider value to the value you expect at the position, e.g. using a switch statement or, in your example and using range 0-4, using a mathematic function


void MyClass::onSliderValueChanged(int value)
{
int actualValue = ( value * 2 ) + 1;
}


Cheers,
_