QML Mac 全屏模式失去鼠标焦点
Posted
技术标签:
【中文标题】QML Mac 全屏模式失去鼠标焦点【英文标题】:QML Mac fullscreen mode lose mouse focus 【发布时间】:2015-05-12 10:02:41 【问题描述】:我正在使用 QML 构建一个支持全屏模式的 OSX 应用程序。我的意图是通过双击窗口的主要区域来切换全屏/正常模式,这是最少的代码:
import QtQuick 2.4
import QtQuick.Window 2.2
Window
id: main
visible: true
width: 800; height: 480
flags: Qt.Window | Qt.WindowFullscreenButtonHint // for OSX native behavior support
MouseArea
anchors.fill: parent
onDoubleClicked:
if (main.visibility === Window.FullScreen)
main.visibility = Window.AutomaticVisibility;
else
main.visibility = Window.FullScreen;
这很简单,但是行为很奇怪:
每当应用程序的可见性状态发生变化(进入或离开),用户必须在窗口中再次单击一次,窗口模式才能再次改变,只需比如应用失去鼠标焦点。
为了验证我的想法,我测试了一些东西,我在窗口中再添加一个MouseArea
(比如说mouseAreaTest
),它并排拆分窗口,可以接收onEntered
和@987654326 @ 事件。在应用程序进入或退出全屏模式后,mouseAreaTest
将永远不会收到任何进入或退出事件,除非您点击窗口再一次,这不是我想要的。
我对 OSX 如何实现自己的全屏模式一无所知,也不知道为什么 OSX 上的 QML 会出现这样的问题。所以我希望有人能告诉我一些关于它的事情。
更新
后来我怀疑这是否只是关于QML的东西,它与QML的窗口系统有关,所以我尝试使用传统的QtWidgets
,发现同样的结果 那里。
更新
跟踪传统widget的鼠标事件,发现问题:双击事件由两个点击事件(press-release-press-release)组成,当窗口状态改变(全屏到正常或正常到全屏) , 除非再点击一次,否则永远不会收到最后一个 RELEASE 事件。
我也做了更多的测试:使用按钮来控制窗口状态,问题就没有了,所以我可能认为这是鼠标事件句柄的错误。
顺便把系统信息贴一下:
OSX 10.10.1 Qt 5.4.1
【问题讨论】:
这可能与 QML 无关,但实际上与包含窗口有关(这就是小部件的行为方式相同的原因)。我已经在我的 OS X 机器和 Windows 机器上测试了代码:后者运行良好。 IMO 触发 bug report 可能是个好主意。 是的,我也在 Windows 上测试过,没有问题,我稍后会向 qt.io 发送一个错误。 有更新吗?我在带有 Qt 5.7 的 OSX 10.11.5 上也遇到了这个问题。 【参考方案1】:这个错误在 Qt 5.11 中仍然存在。我最终找到了解决方法。
没有收到最后一个鼠标释放事件的原因是我们立即切换了全屏。在转换到全屏的过程中,鼠标释放事件不知何故丢失了。
所以修复很简单:我们将切换全屏推迟到下一次鼠标释放事件。即当我们需要切换全屏时,暂时设置一个标志,然后在 mouseReleaseEvent 中,检查标志并做真正的工作。
【讨论】:
以上是关于QML Mac 全屏模式失去鼠标焦点的主要内容,如果未能解决你的问题,请参考以下文章
Parallels Desktop如何全屏后鼠标移到最上不显示MAC菜单栏
自动完成中的 React Material UI 打开模式失去焦点