我使用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
和onExited
事件。在应用程序输入或退出全屏模式后,mouseAreaTest
将永远不会收到任何Enter或Exit事件,除非您再次单击窗口,这不是我想要的。
我对OSX如何实现自己的全屏模式一无所知,也不知道为什么OSX上的QML有这样的错误问题。所以我希望有人会告诉我一些事情。
更新
后来我怀疑这是否只是关于QML的一些内容与QML的Window系统有关,所以我尝试使用传统QtWidgets
,并发现相同的结果< / strong>那里。
更新
我跟踪传统小部件的鼠标事件,发现问题:双击事件包括两个点击事件(按下释放 - 按下 - 释放),当窗口状态变化时(全屏到正常或从全屏到正常) ,永远不会收到最后一次RELEASE事件,除非再次点击。
我还做了更多的测试:使用一个按钮来控制窗口状态,问题就消失了,所以我可能会认为这是鼠标事件句柄的错误。
顺便说一下,发布笔记的系统信息:
OSX 10.10.1
Qt 5.4.1
答案 0 :(得分:0)
此错误在Qt 5.11中仍然存在。我终于找到了解决方法。
未收到上一次鼠标释放事件的原因是我们立即切换了全屏。过渡到全屏模式时,鼠标释放事件以某种方式丢失了。
因此修复很简单:我们将切换全屏显示推迟到下一次鼠标释放事件。也就是说,当我们需要全屏切换时,请暂时设置一个标志,然后在mouseReleaseEvent中检查该标志并完成实际工作。