QSlider mouse direct jump

Vihaan Verma picture Vihaan Verma · Jun 21, 2012 · Viewed 17.4k times · Source

Instead of stepping when the user clicks somewhere on the qslider I want to make the slider jump to that position. How can this be implemented ?

Answer

Micka picture Micka · Oct 9, 2014

after having problems with all versions of @spyke @Massimo Callegari and @Ben (slider position wasnt correct for the whole area) I found some Qt Style functionality within QSlider sourcecode: QStyle::SH_Slider_AbsoluteSetButtons.

You have to create a new QStyle which can be a very annoying, or you use ProxyStyle as shown by user jpn in http://www.qtcentre.org/threads/9208-QSlider-step-customize?p=49035#post49035

I've added another constructor and fixed a typo, but used the rest of the original source code.

#include <QProxyStyle>

class MyStyle : public QProxyStyle
{
public:
    using QProxyStyle::QProxyStyle;

    int styleHint(QStyle::StyleHint hint, const QStyleOption* option = 0, const QWidget* widget = 0, QStyleHintReturn* returnData = 0) const
    {
        if (hint == QStyle::SH_Slider_AbsoluteSetButtons)
            return (Qt::LeftButton | Qt::MidButton | Qt::RightButton);
        return QProxyStyle::styleHint(hint, option, widget, returnData);
    }
};

now you can set the style of your slider in the sliders constructor (if your slider is derived from QSlider):

setStyle(new MyStyle(this->style()));

or it should work this way if it is a standard QSlider:

standardSlider.setStyle(new MyStyle(standardSlider->style()));

so you use the original style of that element, but if the QStyle::SH_Slider_AbsoluteSetButtons "property" is asked you return as you want ;)

maybe you'll have to destroy these proxystyles on slider deletion, not tested yet.