系统:Windows10 64位
Qt版本:5.9.0 msvc2015 64位
编译器:Visual Studio 2015 专业版
背景
需要实现一个全屏化的弹窗。没有其他任何的窗口,只有一个个的弹窗。
方式:
1、设置一个透明化的全屏窗口。
2、每一个弹窗都基于全屏化的窗口来展示。
期望效果图:
结果实现效果图:
原因
据网络相关的issue分析:其根本原因是“失焦”
可能原因:
1、Windows对全屏窗口有特殊的处理,跟常规窗口不同。
2、Qt Quick使用硬件加速,据说在Windows是基于GLFW实现,这里面有些奇怪的feature,似乎是全屏窗口失焦时会停止渲染。
3、与Windows系统合成器对全屏OpenGL窗口的特殊处理有关。
最终,仍然没有明确的原因。
参考链接:
https://bugreports.qt.io/browse/QTBUG-56326
https://bugreports.qt.io/browse/QTBUG-74151
https://www.mimec.org/blog/fullscreen-mode-in-qtquick
解决方案(因为不明确引发该问题的根本原因,因此只有规避措施)
目前的主流规避手段就是,不要设置真全屏窗口,要假全屏。即设置程序的显示大小,不要刚好等于屏幕大小。
比如:
Window { visible: true
//宽或高加减一个不等于0的数,即可去除。 width: Screen.width + 1; height: Screen.height; } |
---|
Window 的属性中width或height加上一个不为0的数值
简易版的复现代码:
import QtQuick 2.6 import QtQuick.Window 2.2 Window { visible: true //宽或高加减一个不等于0的数,即可去除。 //width: Screen.width+1; width: Screen.width; height: Screen.height; color: "#00000000" flags: Qt.FramelessWindowHint Text { id: text; text: qsTr( "text" ); font.family: 'Microsoft YaHei' font.pixelSize: 150 color: "blue" width: parent.width; height: parent.height; } } |
触发条件:
1、Windows属性设置“全屏”
width: Screen.width;
height: Screen.height;
2、Windows标识设置“无边框窗口”
flags: Qt.FramelessWindowHint
备注:
1、只能修改Window的width或height属性。如果修改上述代码中Text的width或height属性,仍然无法规避。
2、该规避措施仅适用于Windows操作系统;Linux操作系统不生效,无法规避。