From bd5a9adfeaa5e3b3c3d2458a070c2022476da7fe Mon Sep 17 00:00:00 2001 From: laserpants Date: Wed, 23 Mar 2016 08:35:41 +0300 Subject: [PATCH] implement slider functionality --- components/slider.cpp | 58 ++++++++++++++++++++++++++++++++++--- components/slider.h | 22 ++++++++++++-- examples/sliderexamples.cpp | 6 ++-- 3 files changed, 78 insertions(+), 8 deletions(-) diff --git a/components/slider.cpp b/components/slider.cpp index 446dd28..6b75ed4 100644 --- a/components/slider.cpp +++ b/components/slider.cpp @@ -1,8 +1,11 @@ #include +#include +#include #include "slider.h" -Handle::Handle(QWidget *parent) - : QWidget(parent) +Handle::Handle(Slider *slider) + : QWidget(slider), + _slider(slider) { } @@ -22,11 +25,35 @@ void Handle::paintEvent(QPaintEvent *event) QWidget::paintEvent(event); } +void Handle::mousePressEvent(QMouseEvent *event) +{ + _eventPos = event->globalPos(); + _offset = pos(); +} + +void Handle::mouseReleaseEvent(QMouseEvent *event) +{ + Q_UNUSED(event) +} + +void Handle::mouseMoveEvent(QMouseEvent *event) +{ + Q_UNUSED(event) + + QWidget *container = parentWidget(); + const QPoint d = _offset + event->globalPos() - _eventPos; + const QSize s = sizeHint(); + QRect r(_slider->orientation() == Qt::Horizontal + ? QPoint(qBound(0, d.x(), container->width()-s.width()), container->height()/2-s.height()/2) + : QPoint(container->width()/2-s.width()/2, qBound(0, d.y(), container->height()-s.height())), s); + setGeometry(r); +} + Slider::Slider(QWidget *parent) : QWidget(parent), - _handle(new Handle(this)) + _handle(new Handle(this)), + _orientation(Qt::Horizontal) { - _handle->setGeometry(10, 10, 30, 30); } Slider::~Slider() @@ -37,7 +64,30 @@ void Slider::paintEvent(QPaintEvent *event) { QPainter painter(this); + const int x = width()/2; + const int y = height()/2; + + QRect r = Qt::Vertical == _orientation + ? QRect(x-2, 0, 4, height()) + : QRect(0, y-2, width(), 4); + + QBrush brush; + brush.setStyle(Qt::SolidPattern); + brush.setColor(QColor(0, 0, 0)); + painter.fillRect(r, brush); + painter.drawRect(rect().adjusted(0, 0, -1, -1)); QWidget::paintEvent(event); } + +void Slider::mousePressEvent(QMouseEvent *event) +{ + const QSize s = _handle->sizeHint(); + + _handle->setGeometry(QRect(Qt::Horizontal == _orientation + ? QPoint(event->pos().x()-s.width()/2, height()/2-s.height()/2) + : QPoint(width()/2-s.width()/2, event->pos().y()-s.height()/2), s)); + + QWidget::mousePressEvent(event); +} diff --git a/components/slider.h b/components/slider.h index 32aeb99..c92139a 100644 --- a/components/slider.h +++ b/components/slider.h @@ -2,17 +2,30 @@ #define SLIDER_H #include +#include + +class Slider; class Handle : public QWidget { Q_OBJECT public: - explicit Handle(QWidget *parent = 0); + explicit Handle(Slider *slider); ~Handle(); + inline QSize sizeHint() const { return QSize(16, 16); } + protected: void paintEvent(QPaintEvent *event); + void mousePressEvent(QMouseEvent *event); + void mouseReleaseEvent(QMouseEvent *event); + void mouseMoveEvent(QMouseEvent *event); + +private: + Slider *const _slider; + QPoint _eventPos; + QPoint _offset; }; class Slider : public QWidget @@ -23,11 +36,16 @@ public: explicit Slider(QWidget *parent = 0); ~Slider(); + inline void setOrientation(Qt::Orientation orientation) { _orientation = orientation; } + inline Qt::Orientation orientation() const { return _orientation; } + protected: void paintEvent(QPaintEvent *event); + void mousePressEvent(QMouseEvent *event); private: - Handle *const _handle; + Handle *const _handle; + Qt::Orientation _orientation; }; #endif // SLIDER_H diff --git a/examples/sliderexamples.cpp b/examples/sliderexamples.cpp index 87e4e1e..45b57b3 100644 --- a/examples/sliderexamples.cpp +++ b/examples/sliderexamples.cpp @@ -22,7 +22,7 @@ SliderExamples::SliderExamples(QWidget *parent) Frame *frame = new Frame; frame->setCodeSnippet( - "---" + "Slider *slider = new Slider;" ); frame->setWidget(view); @@ -35,13 +35,15 @@ SliderExamples::SliderExamples(QWidget *parent) widget->setLayout(layout); Slider *slider = new Slider; + slider->setOrientation(Qt::Vertical); ExampleView *view = new ExampleView; view->setWidget(slider); Frame *frame = new Frame; frame->setCodeSnippet( - "---" + "Slider *slider = new Slider;\n" + "slider->setOrientation(Qt::Vertical);" ); frame->setWidget(view);