Qt Quick Window/Frame 内阴影在调整大小时闪烁
Qt Quick Window/Frame with Inner Shadow flickers while resizing
当我调整包含 Frame
和 InnerShadow
的 Qt Quick ApplicationWindow
大小时,我看到闪烁和视觉伪像。当我不替换默认边框或者如果我为 Frame
对象使用简单的矩形时,情况就不一样了。
我在运行 64 位 Arch Linux
的笔记本电脑上对此进行了测试。它有一个 Nvidia GTX 1060 Max Q 显卡和一个集成的英特尔显卡。我 运行 有和没有 bumblebee
的代码。
有什么方法可以解决或消除这种闪烁?这很糟糕。我的代码和一些截图如下
编辑:我曾尝试设置 AA_ShareOpenGLContexts
和 AA_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
}
}
}
}
当我调整包含 Frame
和 InnerShadow
的 Qt Quick ApplicationWindow
大小时,我看到闪烁和视觉伪像。当我不替换默认边框或者如果我为 Frame
对象使用简单的矩形时,情况就不一样了。
我在运行 64 位 Arch Linux
的笔记本电脑上对此进行了测试。它有一个 Nvidia GTX 1060 Max Q 显卡和一个集成的英特尔显卡。我 运行 有和没有 bumblebee
的代码。
有什么方法可以解决或消除这种闪烁?这很糟糕。我的代码和一些截图如下
编辑:我曾尝试设置 AA_ShareOpenGLContexts
和 AA_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
{transparentRectangle
{grey innerRectangle
} }
或喜欢
Rectangle
{transparentRectangle
{grey innerRectangle
}}
除了设置中间透明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
}
}
}
}