implement drag behavior

This commit is contained in:
laserpants 2016-05-03 08:48:43 +03:00
parent fc253ecd11
commit 6fb7183006
3 changed files with 36 additions and 11 deletions

View File

@ -59,28 +59,50 @@ void Slider::mouseMoveEvent(QMouseEvent *event)
{ {
Q_D(Slider); Q_D(Slider);
QRect track(d->trackGeometry().adjusted(-2, -2, 2, 2)); if (d->slide) {
setSliderPosition(d->valueFromPosition(event->pos()));
} else
{
QRect track(d->trackGeometry().adjusted(-2, -2, 2, 2));
if (track.contains(event->pos()) != d->hoverTrack) { if (track.contains(event->pos()) != d->hoverTrack) {
d->hoverTrack = !d->hoverTrack; d->hoverTrack = !d->hoverTrack;
update(); update();
} }
QRectF thumb(0, 0, 16, 16); QRectF thumb(0, 0, 16, 16);
thumb.moveCenter(d->thumbGeometry().center()); thumb.moveCenter(d->thumbGeometry().center());
if (thumb.contains(event->pos()) != d->hoverThumb) { if (thumb.contains(event->pos()) != d->hoverThumb) {
d->hoverThumb = !d->hoverThumb; d->hoverThumb = !d->hoverThumb;
update(); update();
}
} }
QAbstractSlider::mouseMoveEvent(event); QAbstractSlider::mouseMoveEvent(event);
} }
void Slider::mousePressEvent(QMouseEvent *event)
{
Q_D(Slider);
QRectF thumb(0, 0, 16, 16);
thumb.moveCenter(d->thumbGeometry().center());
if (thumb.contains(event->pos())) {
d->slide = true;
}
}
void Slider::mouseReleaseEvent(QMouseEvent *event) void Slider::mouseReleaseEvent(QMouseEvent *event)
{ {
Q_D(Slider); Q_D(Slider);
if (d->slide) {
d->slide = false;
return QAbstractSlider::mouseReleaseEvent(event);
}
QRect track(d->trackGeometry().adjusted(-2, -2, 2, 2)); QRect track(d->trackGeometry().adjusted(-2, -2, 2, 2));
if (track.contains(event->pos())) { if (track.contains(event->pos())) {

View File

@ -20,6 +20,7 @@ public:
protected: protected:
void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE; void paintEvent(QPaintEvent *event) Q_DECL_OVERRIDE;
void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE; void mouseMoveEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
void mousePressEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE; void mouseReleaseEvent(QMouseEvent *event) Q_DECL_OVERRIDE;
const QScopedPointer<SliderPrivate> d_ptr; const QScopedPointer<SliderPrivate> d_ptr;

View File

@ -17,7 +17,8 @@ public:
: q_ptr(parent), : q_ptr(parent),
orientation(Qt::Horizontal), orientation(Qt::Horizontal),
hoverTrack(false), hoverTrack(false),
hoverThumb(false) hoverThumb(false),
slide(false)
{ {
parent->setMouseTracking(true); parent->setMouseTracking(true);
} }
@ -134,6 +135,7 @@ public:
Qt::Orientation orientation; Qt::Orientation orientation;
bool hoverTrack; bool hoverTrack;
bool hoverThumb; bool hoverThumb;
bool slide;
}; };
#endif // SLIDER_P_H #endif // SLIDER_P_H