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

时间:2011-01-07 15:52:04

标签: c++ qt qt4

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

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

我正在使用Qt 4.6

3 个答案:

答案 0 :(得分: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

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

编辑:

听到这个消息我很难过。

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

答案 1 :(得分:6)

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

  

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

     

wysota

答案 2 :(得分:0)

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

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