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菜单栏

如何失去 QTextEdit 的选择焦点?

在全屏模式下运行 Qt 应用程序时出现“黑屏”问题

自动完成中的 React Material UI 打开模式失去焦点

chrome for mac 的标签栏不见了,一定要鼠标移到顶端才会出现,如何恢复原样?

交叉编译 qml 应用程序和鼠标焦点问题