在Qt中区分单击事件和双击事件

15

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

有没有一种推荐的方式/最佳实践来区分这两个事件?我不想在用户实际执行了双击操作时执行单击操作。

我正在使用Qt 4.6

3个回答

12

将单击和双击相关联是良好的用户界面设计实践:

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

那么您就是在让用户失败。即使他们始终记得单击与双击的区别,也很容易在双击时不小心移动鼠标太远或等待时间过长。

编辑:

很抱歉听到这个消息。

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


3
那是一个很好的观点,但不幸的是,这并不是我可以做出的决定。 - Jesse Vogt
1
@Bill:我不同意,我认为有一些有效的UI设计需要区分这两种点击。例如: <单击>:停止音频播放器并显示所选项目的信息。 <双击>:与单击相同,还会播放所选项目。如果您无法区分它们,那么两者都会被触发,如果单击在双击之后执行,则音频播放器将停止。 - e1i45
1
@e1i45: 你有没有见过双击事件在单击事件之前到达的情况?这听起来非常不可能,因为操作系统直到单击事件被传递后才能确定它是一个双击操作。 - Bill
1
@Bill,没有。但是,在Qt/Windows中,我看到每次双击都会触发以下事件:单击、双击、单击。这使得双击阻止下一个单击成为必要。 - e1i45

7

您可以在QtCentre论坛的双击捕获主题中找到答案;

您可以使用计时器。在releaseEvent处理程序中启动计时器,并确保超时时间足够长,以处理双击事件。然后,在双击事件处理程序中停止计时器并防止其触发。如果未触发双击处理程序,则计时器将超时并调用您选择的插槽,您可以在其中处理单击。当然,这是一种恶劣的方法,但有可能会奏效。

wysota


它能够工作,但是当单击时会导致用户体验延迟。任何应该在单击时发生的事情都会花费“很长”的时间(QApplication::doubleClickInterval()),因此应用程序似乎很慢。虽然我想不出更好的解决方案,除了Bill的答案。 - David Faure

0
使用PySide,它是Qt 4.8的Python绑定,我发现单击会触发一个QEvent.MouseButtonPress事件,而双击则会紧接着触发一个QEvent.MouseButtonPress事件和一个QEvent.MouseButtonDblClick事件。在Windows上,这个延迟大约为100ms。这意味着如果您需要区分单击和双击,仍然存在问题。
解决方案需要另一个QTimer,其延迟略高于内置延迟(添加一些开销)。如果您观察到QEvent.MouseButtonPress事件,则启动自己的计时器,在超时的情况下,它是单击。如果是QEvent.MouseButtonDblClick,则是双击,并停止计时器以避免计为单击。

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