首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >QSlider鼠标直接跳转

QSlider鼠标直接跳转
EN

Stack Overflow用户
提问于 2012-06-21 14:21:20
回答 12查看 17.8K关注 0票数 45

我想让滑块跳到那个位置,而不是在用户单击slider的时候跳到那个位置。如何实现这一点?

EN

回答 12

Stack Overflow用户

回答已采纳

发布于 2012-06-21 14:56:02

好吧,我怀疑Qt有一个直接的功能来达到这个目的。

尝试使用自定义窗口小部件。这应该行得通!

尝试以下逻辑

代码语言:javascript
复制
class MySlider : public QSlider
{

protected:
  void mousePressEvent ( QMouseEvent * event )
  {
    if (event->button() == Qt::LeftButton)
    {
        if (orientation() == Qt::Vertical)
            setValue(minimum() + ((maximum()-minimum()) * (height()-event->y())) / height() ) ;
        else
            setValue(minimum() + ((maximum()-minimum()) * event->x()) / width() ) ;

        event->accept();
    }
    QSlider::mousePressEvent(event);
  }
};
票数 22
EN

Stack Overflow用户

发布于 2014-10-09 22:54:50

在所有版本的@spyke、@Massimo Callegari和@Ben (滑块位置对于整个区域都不正确)出现问题后,我在QSlider源代码:QStyle::SH_Slider_AbsoluteSetButtons中发现了一些Qt风格的功能。

您必须创建一个新的QStyle,这可能非常烦人,或者您可以使用ProxyStyle,如http://www.qtcentre.org/threads/9208-QSlider-step-customize?p=49035#post49035中的用户jpn所示

我添加了另一个构造函数并修复了一个拼写错误,但使用了原始源代码的其余部分。

代码语言:javascript
复制
#include <QProxyStyle>

class MyStyle : public QProxyStyle
{
public:
    using QProxyStyle::QProxyStyle;

    int styleHint(QStyle::StyleHint hint, const QStyleOption* option = 0, const QWidget* widget = 0, QStyleHintReturn* returnData = 0) const
    {
        if (hint == QStyle::SH_Slider_AbsoluteSetButtons)
            return (Qt::LeftButton | Qt::MidButton | Qt::RightButton);
        return QProxyStyle::styleHint(hint, option, widget, returnData);
    }
};

现在可以在滑块构造函数中设置滑块的样式(如果滑块派生自QSlider):

代码语言:javascript
复制
setStyle(new MyStyle(this->style()));

或者,如果它是一个标准的QSlider,它应该是这样工作的:

代码语言:javascript
复制
standardSlider.setStyle(new MyStyle(standardSlider->style()));

因此,您使用该元素的原始样式,但是如果请求QStyle::SH_Slider_AbsoluteSetButtons "property“,则可以按您所需的方式返回;)

也许你将不得不在删除滑块时销毁这些代理样式,还没有测试。

票数 33
EN

Stack Overflow用户

发布于 2013-03-09 23:12:50

我也需要这个,并尝试了spyke解决方案,但它缺少两个东西:

  • inverted appearance
  • handle picking (当鼠标悬停在手柄上时,不需要直接跳转)

所以,下面是复查过的代码:

代码语言:javascript
复制
void MySlider::mousePressEvent ( QMouseEvent * event )
{
  QStyleOptionSlider opt;
  initStyleOption(&opt);
  QRect sr = style()->subControlRect(QStyle::CC_Slider, &opt, QStyle::SC_SliderHandle, this);

  if (event->button() == Qt::LeftButton &&
      sr.contains(event->pos()) == false)
  {
    int newVal;
    if (orientation() == Qt::Vertical)
       newVal = minimum() + ((maximum()-minimum()) * (height()-event->y())) / height();
    else
       newVal = minimum() + ((maximum()-minimum()) * event->x()) / width();

    if (invertedAppearance() == true)
        setValue( maximum() - newVal );
    else
        setValue(newVal);

    event->accept();
  }
  QSlider::mousePressEvent(event);
}
票数 20
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11132597

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档