C++ QSlider手柄和QProxyStyle
默认情况下,QSlider在鼠标单击时按属于pageStep()属性的值移动其拇指轨迹。要使thumbtrack在鼠标点击点直接跳转,我们需要创建一个由QSlider继承的新类 hC++ QSlider手柄和QProxyStyle,c++,qt5,C++,Qt5,默认情况下,QSlider在鼠标单击时按属于pageStep()属性的值移动其拇指轨迹。要使thumbtrack在鼠标点击点直接跳转,我们需要创建一个由QSlider继承的新类 h 应该避免这种情况。触发了什么事件?但在mouseReleaseEvent中,您不是正在发射的事件吗?没有检查press事件最初发生的位置……是的,是由mouseReleaseEvent发出的信号,最初由小部件本身触发 #ifndef QIMPROVEDSLIDER_H #define QIMPROVEDSLIDER_
应该避免这种情况。触发了什么事件?但在
mouseReleaseEvent
中,您不是正在发射的事件吗?没有检查press事件最初发生的位置……是的,是由mouseReleaseEvent
发出的信号,最初由小部件本身触发
#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
#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);
}
}
!sr.contains(event->pos())