implement correct slider handle positioning
This commit is contained in:
parent
bd5a9adfea
commit
b07e24edcc
|
@ -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)
|
void Handle::paintEvent(QPaintEvent *event)
|
||||||
{
|
{
|
||||||
QPainter painter(this);
|
QPainter painter(this);
|
||||||
|
@ -38,15 +63,7 @@ void Handle::mouseReleaseEvent(QMouseEvent *event)
|
||||||
|
|
||||||
void Handle::mouseMoveEvent(QMouseEvent *event)
|
void Handle::mouseMoveEvent(QMouseEvent *event)
|
||||||
{
|
{
|
||||||
Q_UNUSED(event)
|
setPosition(_offset + event->globalPos() - _eventPos);
|
||||||
|
|
||||||
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)
|
Slider::Slider(QWidget *parent)
|
||||||
|
@ -84,10 +101,14 @@ void Slider::paintEvent(QPaintEvent *event)
|
||||||
void Slider::mousePressEvent(QMouseEvent *event)
|
void Slider::mousePressEvent(QMouseEvent *event)
|
||||||
{
|
{
|
||||||
const QSize s = _handle->sizeHint();
|
const QSize s = _handle->sizeHint();
|
||||||
|
_handle->setPosition(event->pos() - QPoint(s.width()/2, s.height()/2));
|
||||||
_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);
|
QWidget::mousePressEvent(event);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void Slider::resizeEvent(QResizeEvent *event)
|
||||||
|
{
|
||||||
|
_handle->refreshGeometry();
|
||||||
|
|
||||||
|
QWidget::resizeEvent(event);
|
||||||
|
}
|
||||||
|
|
|
@ -15,8 +15,12 @@ public:
|
||||||
~Handle();
|
~Handle();
|
||||||
|
|
||||||
inline QSize sizeHint() const { return QSize(16, 16); }
|
inline QSize sizeHint() const { return QSize(16, 16); }
|
||||||
|
inline const QPoint &position() const { return _position; }
|
||||||
|
inline void setPosition(const QPoint &pos);
|
||||||
|
void refreshGeometry();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
bool event(QEvent *event);
|
||||||
void paintEvent(QPaintEvent *event);
|
void paintEvent(QPaintEvent *event);
|
||||||
void mousePressEvent(QMouseEvent *event);
|
void mousePressEvent(QMouseEvent *event);
|
||||||
void mouseReleaseEvent(QMouseEvent *event);
|
void mouseReleaseEvent(QMouseEvent *event);
|
||||||
|
@ -24,6 +28,7 @@ protected:
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Slider *const _slider;
|
Slider *const _slider;
|
||||||
|
QPoint _position;
|
||||||
QPoint _eventPos;
|
QPoint _eventPos;
|
||||||
QPoint _offset;
|
QPoint _offset;
|
||||||
};
|
};
|
||||||
|
@ -42,6 +47,7 @@ public:
|
||||||
protected:
|
protected:
|
||||||
void paintEvent(QPaintEvent *event);
|
void paintEvent(QPaintEvent *event);
|
||||||
void mousePressEvent(QMouseEvent *event);
|
void mousePressEvent(QMouseEvent *event);
|
||||||
|
void resizeEvent(QResizeEvent *event);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
Handle *const _handle;
|
Handle *const _handle;
|
||||||
|
|
Loading…
Reference in New Issue