QSlider句柄和QProxyStyle

时间:2017-01-03 11:05:38

标签: c++ qt5

默认情况下,QSlider在鼠标单击时将其指点移动属于pageStep()prop的值。要使鼠标点击点直接跳转,我们需要创建一个由QSlider继承的新类。

·H

#ifndef QIMPROVEDSLIDER_H
#define QIMPROVEDSLIDER_H

#include <QSlider>

class QImprovedSlider : public QSlider
{
    Q_OBJECT
protected:
    void mousePressEvent(QMouseEvent *event) override;
    void mouseReleaseEvent(QMouseEvent *event) override;
public:
    explicit QImprovedSlider(QWidget *parent = 0);

signals:
    void clicked(int value) const;

};

#endif // QIMPROVEDSLIDER_H

的.cpp

#include <QWidget>
#include <QMouseEvent>
#include <QStyle>
#include <QStyleOptionSlider>
#include <QProxyStyle>
#include "QImprovedSlider.h"

class QImprovedSliderStyle : 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);
        }
};

QImprovedSlider::QImprovedSlider(QWidget *parent) :
        QSlider(parent)
    {
        setStyle(new QImprovedSliderStyle(this->style()));
    }

void QImprovedSlider::mousePressEvent(QMouseEvent *event) {
    QStyleOptionSlider opt;
    initStyleOption(&opt);
    QRect sr = style()->subControlRect(QStyle::CC_Slider,
                                       &opt,
                                       QStyle::SC_SliderHandle,
                                       this);
    qDebug() << sr.height() << sr.width();
    if (!sr.contains(event->pos()) && event->button() == Qt::LeftButton) {
        if (orientation() == Qt::Vertical)
            setValue(minimum() + ((maximum()-minimum()) * (height()-event->y())) / height() ) ;
        else
            setValue(minimum() + ((maximum()-minimum()) * event->x()) / width() ) ;
    }
    QSlider::mousePressEvent(event);
}

void QImprovedSlider::mouseReleaseEvent(QMouseEvent *event) {
    if (event->button() == Qt::LeftButton) {
            emit clicked(value());
            QSlider::mouseReleaseEvent(event);
    }
}

QImprovedSliderStyle使句柄拖动更加流畅,但这样,即使点击落入句柄内,事件也会被触发,而条件

!sr.contains(event->pos())

应该避免这种情况。

0 个答案:

没有答案