Qml之Windows全屏属性导致黑屏

环境

系统:Windows10 64位 
Qt版本:5.9.0 msvc2015 64位
编译器:Visual Studio 2015 专业版

 

背景

      需要实现一个全屏化的弹窗。没有其他任何的窗口,只有一个个的弹窗。

方式:

    1、设置一个透明化的全屏窗口。

    2、每一个弹窗都基于全屏化的窗口来展示。

 

期望效果图:

Qml之Windows全屏属性导致黑屏

 

 

 

结果实现效果图:

Qml之Windows全屏属性导致黑屏

 

 

 

 

原因

据网络相关的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://blog.csdn.net/chase_hung/article/details/80863531

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操作系统不生效,无法规避。

 

上一篇:wpf 获取窗口所在屏幕 根据父窗口所在屏幕定位子窗口


下一篇:Linux screen工具