【发布时间】:2011-06-05 08:51:18
【问题描述】:
我有一个QAbstractItemView,它需要对单击和双击事件做出反应。根据是单击还是双击,操作会有所不同。出现的问题是在双击事件之前接收到单击事件。
是否有区分两者的推荐方法/最佳实践?当用户实际双击时,我不想执行单击操作。
我使用的是 Qt 4.6
【问题讨论】:
我有一个QAbstractItemView,它需要对单击和双击事件做出反应。根据是单击还是双击,操作会有所不同。出现的问题是在双击事件之前接收到单击事件。
是否有区分两者的推荐方法/最佳实践?当用户实际双击时,我不想执行单击操作。
我使用的是 Qt 4.6
【问题讨论】:
这是一个很好的 UI 设计,可以确保您的单击和双击在概念上是相关的:
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
然后,您将用户设置为失败。即使他们始终记得单击与双击的区别,在双击时很容易意外地将鼠标移动得太远或等待太久。
编辑:
很遗憾听到这个消息。
在那种情况下,我发现这两篇文章很有用:
【讨论】:
您可以在QtCentre论坛上标题为Double Click Capturing的帖子中找到答案;
你可以有一个计时器。启动 releaseEvent 处理程序中的计时器和 确保超时时间足够长 首先处理双击。 然后,在双击事件中 处理程序,您可以停止计时器并 防止它开火。如果双 点击处理程序没有被触发, 计时器将超时并调用一个插槽 您的选择,您可以在哪里处理 单击。这当然是一个 讨厌的黑客,但有机会工作。
wysota
【讨论】:
使用 Qt 4.8 的 Python 绑定 PySide 我看到单击会传递一个 QEvent.MouseButtonPress 事件,而双击会传递一个 QEvent.MouseButtonPress 事件,紧随其后的是 QEvent.MouseButtonDblClick。在 Windows 上,延迟大约是 100ms。这意味着如果您需要区分单击和双击,您仍然会遇到问题。
该解决方案需要另一个QTimer,其延迟略高于内置延迟(增加了一些开销)。如果您观察到 QEvent.MouseButtonPress 事件,您将启动自己的计时器,如果超时,只需单击一下即可。在QEvent.MouseButtonDblClick 的情况下,它是双击,您会停止计时器以避免计为单击。
【讨论】: