QSlider鼠标直接跳跃

49

我希望在用户点击qslider的某个位置时,不是步进式移动,而是直接跳到该位置。如何实现?


2
请查看Micka的答案,而不是接受的答案,以获取简单的解决方案。 - Tim MB
2
请注意,滑块的默认行为因平台而异。例如,在MacOS上,滑块会直接跳转到鼠标单击的位置。 - normanius
12个回答

0
一个简单的方法是从QSlider派生并重新实现mousePressEvent(....),使用setSliderPosition(int)设置标记位置。

0

我也遇到了这个问题。我的解决方案如下所示。

slider->installEventFilter(this);
---    
bool MyDialog::eventFilter(QObject *object, QEvent *event)
    {
        if (object == slider && slider->isEnabled())
        {
            if (event->type() == QEvent::MouseButtonPress)
            {
                auto mevent = static_cast<QMouseEvent *>(event);
                qreal value = slider->minimum() + (slider->maximum() - slider->minimum()) * mevent->localPos().x() / slider->width();
                if (mevent->button() == Qt::LeftButton)
                {
                    slider->setValue(qRound(value));
                }
                event->accept();
                return true;
            }
            if (event->type() == QEvent::MouseMove)
            {
                auto mevent = static_cast<QMouseEvent *>(event);
                qreal value = slider->minimum() + (slider->maximum() - slider->minimum()) * mevent->localPos().x() / slider->width();
                if (mevent->buttons() & Qt::LeftButton)
                {
                    slider->setValue(qRound(value));
                }
                event->accept();
                return true;
            }
            if (event->type() == QEvent::MouseButtonDblClick)
            {
                event->accept();
                return true;
            }
        }
        return QDialog::eventFilter(object, event);
    }

您还可以重写 QSlider 的这些事件处理程序:

  • QSlider::mousePressedEvent
  • QSlider::mouseMoveEvent
  • QSlider::mouseDoubleClickEvent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接