【发布时间】: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 上也遇到了这个问题。
标签: macos qt qml fullscreen