implement correct slider handle positioning

This commit is contained in:
laserpants 2016-03-24 08:52:27 +03:00
parent bd5a9adfea
commit b07e24edcc
2 changed files with 40 additions and 13 deletions

View File

@ -13,6 +13,31 @@ Handle::~Handle()
{
}
void Handle::setPosition(const QPoint &pos)
{
_position = pos;
refreshGeometry();
}
void Handle::refreshGeometry()
{
QWidget *container = parentWidget();
const QSize s = sizeHint();
setGeometry(QRect(_slider->orientation() == Qt::Horizontal
? QPoint(qBound(0, _position.x(), container->width()-s.width()), container->height()/2-s.height()/2)
: QPoint(container->width()/2-s.width()/2, qBound(0, _position.y(), container->height()-s.height())), s));
update();
}
bool Handle::event(QEvent *event)
{
qDebug() << event;
return QWidget::event(event);
}
void Handle::paintEvent(QPaintEvent *event)
{
QPainter painter(this);
@ -38,15 +63,7 @@ void Handle::mouseReleaseEvent(QMouseEvent *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);
setPosition(_offset + event->globalPos() - _eventPos);
}
Slider::Slider(QWidget *parent)
@ -84,10 +101,14 @@ void Slider::paintEvent(QPaintEvent *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));
_handle->setPosition(event->pos() - QPoint(s.width()/2, s.height()/2));
QWidget::mousePressEvent(event);
}
void Slider::resizeEvent(QResizeEvent *event)
{
_handle->refreshGeometry();
QWidget::resizeEvent(event);
}

View File

@ -15,8 +15,12 @@ public:
~Handle();
inline QSize sizeHint() const { return QSize(16, 16); }
inline const QPoint &position() const { return _position; }
inline void setPosition(const QPoint &pos);
void refreshGeometry();
protected:
bool event(QEvent *event);
void paintEvent(QPaintEvent *event);
void mousePressEvent(QMouseEvent *event);
void mouseReleaseEvent(QMouseEvent *event);
@ -24,6 +28,7 @@ protected:
private:
Slider *const _slider;
QPoint _position;
QPoint _eventPos;
QPoint _offset;
};
@ -42,6 +47,7 @@ public:
protected:
void paintEvent(QPaintEvent *event);
void mousePressEvent(QMouseEvent *event);
void resizeEvent(QResizeEvent *event);
private:
Handle *const _handle;