【问题标题】:Distinguish between single and double click events in Qt区分 Qt 中的单击事件和双击事件
【发布时间】:2011-06-05 08:51:18
【问题描述】:

我有一个QAbstractItemView,它需要对单击和双击事件做出反应。根据是单击还是双击,操作会有所不同。出现的问题是在双击事件之前接收到单击事件。

是否有区分两者的推荐方法/最佳实践?当用户实际双击时,我不想执行单击操作。

我使用的是 Qt 4.6

【问题讨论】:

    标签: c++ qt qt4


    【解决方案1】:

    这是一个很好的 UI 设计,可以确保您的单击和双击在概念上是相关的:

    Single-Click: select icon
    Double-Click: select icon and open it
    
    Single-Click: select color
    Double-Click: select color and open palette editor
    

    请注意,在这些示例中,单击操作实际上是双击的子集。这意味着您可以继续正常执行单击操作,如果双击进入,则只需执行附加操作。

    如果您的用户界面执行以下操作:

    Single-Click: select icon
    Double-Click: close window
    

    然后,您将用户设置为失败。即使他们始终记得单击与双击的区别,在双击时很容易意外地将鼠标移动得太远或等待太久。

    编辑:

    很遗憾听到这个消息。

    在那种情况下,我发现这两篇文章很有用:

    【讨论】:

    • 这是一个很好的观点,但不幸的是,这不是我的决定。
    • @Bill:我不同意,我相信有有效的 UI 设计需要区分两次点击。例如。 :停止音频播放器,显示所选项目的信息。 :同单击:加播放选中的项目。如果无法区分,则两者都被触发,如果双击后执行单击,则音频播放器将停止。
    • @e1i45:你有没有看到双击事件在单击之前到达?这听起来不太可能,因为操作系统在单击完成之前无法判断这是一个双击操作。
    • @Bill,不,我没有。但是,在 Qt/Windows 中,我看到每次双击都会触发以下事件:单击、双击、单击。这使得双击阻止下一次单击是必要的。
    【解决方案2】:

    您可以在QtCentre论坛上标题为Double Click Capturing的帖子中找到答案;

    你可以有一个计时器。启动 releaseEvent 处理程序中的计时器和 确保超时时间足够长 首先处理双击。 然后,在双击事件中 处理程序,您可以停止计时器并 防止它开火。如果双 点击处理程序没有被触发, 计时器将超时并调用一个插槽 您的选择,您可以在哪里处理 单击。这当然是一个 讨厌的黑客,但有机会工作。

    wysota

    【讨论】:

    • 它可以工作,但当然它会在单击时造成用户体验延迟。在单击时发生的任何事情似乎都需要“很长时间”(QApplication::doubleClickInterval()),因此应用程序似乎很慢。除了比尔的回答之外,我并没有想到更好的解决方案。
    【解决方案3】:

    使用 Qt 4.8 的 Python 绑定 PySide 我看到单击会传递一个 QEvent.MouseButtonPress 事件,而双击会传递一个 QEvent.MouseButtonPress 事件,紧随其后的是 QEvent.MouseButtonDblClick。在 Windows 上,延迟大约是 100ms。这意味着如果您需要区分单击和双击,您仍然会遇到问题。

    该解决方案需要另一个QTimer,其延迟略高于内置延迟(增加了一些开销)。如果您观察到 QEvent.MouseButtonPress 事件,您将启动自己的计时器,如果超时,只需单击一下即可。在QEvent.MouseButtonDblClick 的情况下,它是双击,您会停止计时器以避免计为单击。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-06
      • 2018-07-02
      • 1970-01-01
      • 2014-05-17
      • 1970-01-01
      • 2012-01-25
      • 2021-11-23
      • 1970-01-01
      相关资源
      最近更新 更多