我有QAbstractItemView
需要对单击和双击事件做出反应。根据是单击还是双击,操作会有所不同。发生的问题是在双击事件之前收到单击事件。
是否有推荐的方法/最佳做法来区分两者?当用户实际双击时,我不想执行单击操作。
我正在使用Qt 4.6
答案 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
,则双击并停止计时器以避免单击计数。