环境

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

 

背景

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

方式:

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

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

 

期望效果图:

Qml之Windows全屏属性导致黑屏_解决方案

 

 

 

结果实现效果图:

Qml之Windows全屏属性导致黑屏_无边框_02

 

 

 

 

原因

据网络相关的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操作系统不生效,无法规避。