QSlider mouse direct jump

后端 未结 12 1729
爱一瞬间的悲伤
爱一瞬间的悲伤 2020-12-23 16:27

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 ?

12条回答
  •  醉梦人生
    2020-12-23 17:23

    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 
    
    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.

提交回复
热议问题