【问题标题】:How can i slow down QSpinBox scrolls while holding Up/Down (Keyboard)如何在按住向上/向下键时减慢 QSpinBox 滚动(键盘)
【发布时间】:2016-04-18 08:03:58
【问题描述】:

场景如下: 当我的活动小部件是 QSpinBox 时,我可以通过单击或按住框的箭头或按或 按住 Page Up/ 来更改值Page Down/  ▲  /  ▼  。

问题是,我在 valueChanged() 上有一些硬件通信,这需要几毫秒。 当我永久滚动(鼠标)或按住框箭头时,这不是问题,因为这里的滚动似乎更慢(加速关闭),但是当我使用我的键盘时(加速也关闭),滚动速度是快得多,这会导致计时问题。应用程序变慢,然后冻结几秒钟,直到事件队列完成。

我需要允许使用键盘输入(包括按住键盘键),所以我想知道是否有办法减慢箭头/向上/向下的键重复率。

实际上,我在值更改时触发了一个 200 毫秒的 oneshot 计时器,它在超时时传递了 spinbox 值。只有在没有运行时才会触发计时器。这意味着当我更改值时,它总是会有 200 毫秒的延迟,并且更新频率只能是 5 更新/秒 或更慢。它确实有效,但我真的很想通过某种方式降低键重复率来改进它。

【问题讨论】:

    标签: c++ qt


    【解决方案1】:

    好的,不,我看到了问题。这里的问题是键盘在按住按钮时返回字符。

    为了在不直接与键盘交互的情况下克服这个问题,我会尝试使用event filter,观察key press events,如果它们很快到达,则拒绝其中的一些。

    【讨论】:

    • 这并不能真正解决我的问题,因为在这种情况下事件过滤器也需要一个计时器,而我真的不想使用计时器。
    • 不,你不需要计时器。您只需要计算自上次事件以来的时间差,因此您需要存储上次通过事件的时间来决定是通过还是忽略下一个事件。
    【解决方案2】:

    您的设备通信子系统有两种状态:忙碌和可用。当它很忙时,您应该安排更新目标中的特定变量,但暂时不要执行它。当之前的通信完成并且子系统可用时,它应该拾取任何未完成的更改并传播它们。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-17
      • 1970-01-01
      • 2022-10-09
      • 1970-01-01
      相关资源
      最近更新 更多