【问题标题】:Disable QSlider's valueChanged on keyboard arrow keys在键盘箭头键上禁用 QSlider 的 valueChanged
【发布时间】:2019-04-11 19:03:08
【问题描述】:

如何在键盘箭头和 mouseWheel 滚动上禁用 QSlider 发出的 SIGNAL valueChanged。通过设置

    ui->horizontalSlider->setFocusPolicy(Qt::NoFocus);

键盘的方向键没有发出信号。

我怎样才能为鼠标滚轮滚动做同样的事情? 我不想从 QSlider 重新实现我的自定义 Slider 类。 我要求任何解决方法或 api,以便我可以禁用响应 qslider 的键盘和鼠标滚轮滚动。

主要目的是避免在每个 valueChange 上发送信号。所以我已经实现了以下,它工作正常

on_horizontalSlider_sliderReleased()
on_horizontalSlider_sliderPressed()

基于在这 2 个插槽中更新的布尔标志,

on_horizontalSlider_valueChanged(int)

正在执行所需的操作...例如在释放滑块后,正在向所需的应用程序中添加值。

请求提供解决方法和示例。

【问题讨论】:

  • 那是不可能的。如果值发生变化,则发出该信号。这就是它的定义。您已经自己提出了解决方案:使用按下/释放信号对值做出反应,而不是使用 valueChanged 信号。
  • 是的..没错。

标签: c++ qt keyboard mousewheel qslider


【解决方案1】:
class CBlockWheelEV: public QObject
{
    Q_OBJECT
public:
    CBlockWheelEV( QObject* parent ): QObject( parent ) {}
    bool eventFilter(QObject * pObject, QEvent * pEvent) override
    {
        if ( pEvent->type() == QEvent::Wheel )
        {
            qDebug() << pObject << pEvent;
            return true; // if return false - Scroll was unlocking
        }
        return false;
    }
};

...
ui->sldTest->installEventFilter( new CBlockWheelEV( ui->sldTest ) );
...

您可以使用 EventFilter 来阻止通过轮子旋转从 QSlider 发出 ValueChanged 信号。但是如果你想要一些特殊的行为——你需要在 EventFilter 中控制额外的选项。 EventFilter 可以管理对象的许多行为,而无需对其进行子类化。

【讨论】:

  • 我会实现这个并让你知道......但一个问题是,如果它禁用 mouseWheel 按钮点击......那么我们可能不得不改变一些主要的事情。
  • 我认为鼠标按钮按下有另一种事件类型,如:QEvent::MouseButtonDblClick QEvent::MouseButtonPress QEvent::MouseButtonRelease
  • 一个更简单的资源管理思路是使用下面的方法:static installOn(QObject *o) { Q_ASSERT(o-&gt;thread() &amp;&amp; qApp &amp;&amp; o-&gt;thread() == qApp-&gt;thread()); static CBlockWheelEv blocker; o-&gt;installEventFilter(&amp;blocker); } 过滤器在非gui线程中是非常没用的,你不需要多个实例。跨度>
猜你喜欢
  • 1970-01-01
  • 2017-11-13
  • 1970-01-01
  • 2012-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多