如何在没有 MouseEvent 的情况下检测 Qt 中的鼠标状态
Posted
技术标签:
【中文标题】如何在没有 MouseEvent 的情况下检测 Qt 中的鼠标状态【英文标题】:How to detect the mouse state in Qt without a MouseEvent 【发布时间】:2009-08-21 15:45:31 【问题描述】:好的,使用 Qt,我想知道如何在任何时间点检测鼠标的当前状态 - 没有 MouseEvent。
使用 QCursor::pos() 可以得到它的位置,但是有没有办法确定按钮的当前状态?
基本上,我希望在计时器关闭时验证鼠标的状态,因此它不会与任何特定的 MouseEvent 相关,因此没有可查询的 MouseEvent。我需要知道如何在没有 MouseEvent 的情况下查询鼠标的状态——尤其是按钮的状态。
哦,我使用的是 Qt 3,所以如果在 Qt 4 中添加了这样的功能,但在 Qt 3 中没有,它对我没有多大帮助(尽管它仍然很高兴知道) .
【问题讨论】:
【参考方案1】:Qt::MouseButtons QApplication::mouseButtons () [static]:
返回鼠标按钮的当前状态。目前的 当事件队列中的事件清空时,状态会同步更新 这将自发地改变鼠标状态(
QEvent::MousePress
和QEvent::MouseRelease
事件)。请注意,这可能无法反映实际按住的按钮 调用时的输入设备,而不是鼠标按钮 最后一次在上述事件之一中报告。如果没有鼠标按钮 被持有
Qt::NoButton
被返回。
编辑:嗯,我刚刚注意到您询问了 Qt3.3。恐怕这个答案适用于Qt4。
【讨论】:
好吧,就像我在问题中所说的那样,即使 qt3 中没有,也很高兴知道 qt4 中是否有办法做到这一点。如果不出意外,我可以在相关应用程序的未来版本中使用它(而且了解更多关于这类事情总是好的)。然而,当前版本是在 qt3 中,所以除非有办法在 qt3 中做到这一点,否则我暂时不走运。但如果它是在 qt4 中而不是 qt3 中,那只是表明 trolltech 继续改进 qt 并使其成为更好的工具包。【参考方案2】:不使用 MouseEvent 是硬性要求吗?或者你可以间接使用 MouseEvents 吗?
如果您为每个按钮创建一个布尔变量并使用鼠标按下/释放事件对其进行更新,那么您只需在计时器关闭时查看相关布尔值的值。
【讨论】:
不能与事件相关。我的意思是,如果有一个函数通过返回 MouseEvent 来为您提供当前的鼠标状态,那很好,但我不能处理事件。我必须能够简单地查询鼠标的当前状态,而不必担心哪些事件已经触发或没有触发。 为什么您无法访问这些活动?你担心性能吗?您的代码如何在 GUI 中运行而不因事件而分派? 这是一个复杂的系统,绝对不是没有错误的,我不能保证我不会错过任何事件。所以,虽然它被设置为定时器应该只在鼠标处于正确状态时才关闭,但我需要能够在鼠标关闭时检查鼠标的状态,以确保没有事件落空了。 我很欣赏复杂系统的脆弱性。 :) 我建议使用 Dave 的解决方案,但只需保存标志本身而不是将它们转换为布尔值。即使您删除了一些事件(尽管 Qt 应该将每个鼠标事件都传递给您),在您访问 Qt4 之前,您将尽可能保持最新状态。 这种情况是当您嵌入了来自其他应用程序的小部件时,Qt 的事件在您期望它们时不会到达您的手中。所以我再次使用最低硬件级别检查器:GetAsyncKeyState (win32) 来获取鼠标按钮状态(索引 0,1,2)【参考方案3】:Qt5 (5.3.2) 更新:
if (QGuiApplication::mouseButtons() == Qt::LeftButton) ...
我正在使用 QApplication,但那里没有 mouseButtons()
函数。您需要包含<QGuiApplication>
【讨论】:
以上是关于如何在没有 MouseEvent 的情况下检测 Qt 中的鼠标状态的主要内容,如果未能解决你的问题,请参考以下文章