Qt Quick Window/Frame 内阴影在调整大小时闪烁

Qt Quick Window/Frame with Inner Shadow flickers while resizing

当我调整包含 FrameInnerShadow 的 Qt Quick ApplicationWindow 大小时,我看到闪烁和视觉伪像。当我不替换默认边框或者如果我为 Frame 对象使用简单的矩形时,情况就不一样了。

我在运行 64 位 Arch Linux 的笔记本电脑上对此进行了测试。它有一个 Nvidia GTX 1060 Max Q 显卡和一个集成的英特尔显卡。我 运行 有和没有 bumblebee 的代码。

有什么方法可以解决或消除这种闪烁?这很糟糕。我的代码和一些截图如下

编辑:我曾尝试设置 AA_ShareOpenGLContextsAA_UseOpenGLES(及其 software/desktop 变体)属性,但没有成功。

更新:我在这里创建了一个问题:https://bugreports.qt.io/browse/QTBUG-81519,但我仍然希望有人可以设计一个解决方法。

test.qml

import QtQuick 2.14
import QtQuick.Controls 2.14
import QtGraphicalEffects 1.14

ApplicationWindow{
    id: main
    width: 2*screen.width/3
    height: 2*screen.height/3
    title: "Test ApplicationWindow"  
    color: activeColorPalette.window 
    visible:true
    SystemPalette {
        id: activeColorPalette
        colorGroup: SystemPalette.Active
    }    
    Frame{
        anchors.fill: parent 
        anchors.margins: 10
        background: Item{
            id: root
            anchors.fill: parent
            Rectangle{
                anchors.fill: parent
                anchors.margins: 1
                radius: 16
                color: activeColorPalette.window
            }
            InnerShadow {
                anchors.fill: root
                horizontalOffset: 0
                verticalOffset: 0
                source: root
                radius: 16
                color: activeColorPalette.shadow
                spread: 0.6        
                samples: 32        
                cached: true
                fast:true
            }
        }
    }
}

Window 无闪烁或伪像

Window 调整大小时出现 flickering/visual 个伪影

我找到了一个解决方法来消除调整大小时的视觉伪影。

在我的问题代码中,InnerShadow 使用 Item QML 类型作为源,默认情况下它是透明的,并且包含我在其中添加的灰色 Rectangle。透明源 Item 和内部较小的 child Rectangle 之间的视觉区别是 InnerShadow 用来计算内部阴影梯度的。最终结果是一个装饰性的阴影边框。但是,调整应用程序的大小会导致有时会留下难看的视觉伪影。注意:将外部 Item 更改为透明 Rectangle 没有明显效果。

但是当我将灰色最里面的矩形封装到另一个透明组件中时

Item {transparent Rectangle {grey inner Rectangle} }

或喜欢

Rectangle{transparent Rectangle{grey inner Rectangle}}

除了设置中间透明Rectangle作为来源对于 InnerShadow,消除了视觉伪影。下面是 test_workaround.qml 的工作代码,您可以将其与上面的 test.qml 进行比较。

test_workaround.qml

import QtQuick 2.14
import QtQuick.Controls 2.14
import QtGraphicalEffects 1.14

ApplicationWindow{
    id: main
    width: 2*screen.width/3
    height: 2*screen.height/3
    title: "Test ApplicationWindow"  
    color: activeColorPalette.window 
    visible:true
    SystemPalette {
        id: activeColorPalette
        colorGroup: SystemPalette.Active
    }    
    Frame{
        anchors.fill: parent 
        anchors.margins: 10
        background: Item{
            id: root
            anchors.fill: parent
            Rectangle{
                 id: middleRect
                 anchors.fill: parent
                 color: "transparent"           
                Rectangle{
                    id: innerRect
                    anchors.fill: parent
                    anchors.margins: 1
                    radius: 16
                    color: activeColorPalette.window
                }
            }
            InnerShadow {
                anchors.fill: root
                horizontalOffset: 0
                verticalOffset: 0
                source: middleRect
                radius: 16
                color: activeColorPalette.shadow
                spread: 0.6        
                samples: 32        
                cached: true
                fast:true
                smooth:true
            }  
        } 
    }
}