问题 区分Qt中的单击和双击事件


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

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

我使用的是Qt 4.6


1683
2018-01-07 15:52


起源



答案:


您可以在标题为的主题中找到答案 双击捕捉 上 QtCentre 论坛;

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

wysota


6
2018-01-07 16:10



它可以工作,但当然单击一下就会造成用户体验的延迟。单击时发生的任何事情都会花费很长时间(QApplication :: doubleClickInterval()),因此应用程序似乎很慢。除了比尔的答案之外,并不是说我能想出更好的解决方案。 - David Faure


答案:


您可以在标题为的主题中找到答案 双击捕捉 上 QtCentre 论坛;

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

wysota


6
2018-01-07 16:10



它可以工作,但当然单击一下就会造成用户体验的延迟。单击时发生的任何事情都会花费很长时间(QApplication :: doubleClickInterval()),因此应用程序似乎很慢。除了比尔的答案之外,并不是说我能想出更好的解决方案。 - David Faure


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

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

然后,您将设置用户失败。即使他们记得单击一下而不是一直双击,在双击或等待太久时,很容易意外地将鼠标移动太远。

编辑:

听到这个消息我很难过。

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


9
2018-01-07 17:49



这是一个好点,但不幸的是,不是我的决定。 - Jesse Vogt
@Bill:我不同意,我相信有一些有效的UI设计需要区分两次点击。例如。 <单击>:停止音频播放器,显示所选项目的信息。 <双击>:与单击相同:加上播放所选项目。如果您无法区分它们,则两者都会被触发,如果在双击后执行单击,则音频播放器将被停止。 - e1i45
@ e1i45:您是否看到双击事件在单击之前到达?这听起来不太可能,因为操作系统无法告诉它是一次双击操作,直到单击发送完毕。 - Bill
@Bill,不,我没有。但是,Qt / Windows我看到每次双击都会触发以下事件:单击,双击,单击。这使得双击必须阻止下一次单击。 - e1i45


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

解决方案需要另一个 QTimer 延迟略高于内置延迟(增加一些开销)。如果你观察到了 QEvent.MouseButtonPress 事件你开始自己的计时器,如果超时只需单击一下。如果是 QEvent.MouseButtonDblClick 它是一个双击,你停止计时器,以避免单击计数。


0
2017-09-02 15:03