2011-01-07 226 views
11

我有一个QAbstractItemView需要对单击和双击事件做出反应。这些操作根据是单击还是双击而不同。发生的问题是在双击事件之前接收到单击事件。区分Qt中的单击事件和双击事件

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

我使用Qt 4.6

回答

6

你可以找到在QtCentre论坛题为Double Click Capturing线程的答案;

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

wysota

+0

它可以工作,但当它单击时会在用户体验上造成延迟。无论单击会发生什么,都会花费很长时间(QApplication :: doubleClickInterval()),所以应用程序看起来很慢。尽管如此,除了比尔的答案之外,我不能想出更好的解决方案。 – 2016-11-18 12:27:34

9

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

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 

那你就将用户设置为失败。即使他们记得单击操作与双击双击,但在双击或等待时间过长时,意外移动鼠标太容易。

编辑:

我很抱歉听到这些。

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

+2

这是一个很好的观点,但不幸的是,这不是我做出的决定。 – 2011-01-07 17:59:01

0

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

该解决方案需要另一个QTimer延迟比内置延迟略高(增加一些开销)。如果您观察到QEvent.MouseButtonPress事件,则您启动自己的计时器,万一发生超时,则为单击。在QEvent.MouseButtonDblClick的情况下,这是一个双击,你停止计时器,以避免单击计数。