QML Mac全屏模式失去鼠标焦点

时间:2015-05-12 10:02:41

标签: macos qt qml fullscreen

我使用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),将窗口分开并且可以接收onEnteredonExited事件。在应用程序输入退出全屏模式后,mouseAreaTest将永远不会收到任何Enter或Exit事件,除非您再次单击窗口,这不是我想要的。

我对OSX如何实现自己的全屏模式一无所知,也不知道为什么OSX上的QML有这样的错误问题。所以我希望有人会告诉我一些事情。

更新

后来我怀疑这是否只是关于QML的一些内容与QML的Window系统有关,所以我尝试使用传统QtWidgets ,并发现相同的结果< / strong>那里。

更新

我跟踪传统小部件的鼠标事件,发现问题:双击事件包括两个点击事件(按下释放 - 按下 - 释放),当窗口状态变化时(全屏到正常或从全屏到正常) ,永远不会收到最后一次RELEASE事件,除非再次点击

我还做了更多的测试:使用一个按钮来控制窗口状态,问题就消失了,所以我可能会认为这是鼠标事件句柄的错误。

顺便说一下,发布笔记的系统信息:

OSX 10.10.1
Qt 5.4.1

1 个答案:

答案 0 :(得分:0)

此错误在Qt 5.11中仍然存在。我终于找到了解决方法。

未收到上一次鼠标释放事件的原因是我们立即切换了全屏。过渡到全屏模式时,鼠标释放事件以某种方式丢失了。

因此修复很简单:我们将切换全屏显示推迟到下一次鼠标释放事件。也就是说,当我们需要全屏切换时,请暂时设置一个标志,然后在mouseReleaseEvent中检查该标志并完成实际工作。