QML Popup Overlay.modal 过渡不起作用

Posted

技术标签:

【中文标题】QML Popup Overlay.modal 过渡不起作用【英文标题】:QML Popup Overlay.modal transition not working 【发布时间】:2021-04-19 19:41:00 【问题描述】:

我有以下 QML 组件,它使用 Overlay.modal 功能来模糊和调暗背景:

import QtQuick 2.0
import QtQuick.Controls 2.15
import QtGraphicalEffects 1.12

Popup 
    readonly property color backdropColor

    id: root
    visible: true
    padding: 50
    modal: true
    anchors.centerIn: parent
    width: 500
    height: 300

    contentItem: CB.Button 

    background: CB.Card 

    Overlay.modal: GaussianBlur 
        source: ShaderEffectSource 
            sourceItem: root.parent
            live: true
        
        radius: 10
        samples: radius * 2

        Rectangle 
            id: backdropDim

            color: backdropColor
            anchors.fill: parent
        
    

    exit: Transition 
        NumberAnimation  property: "opacity"; from: 1; to: 0; duration: 120 
        NumberAnimation  target: backdropDim; property: "opacity"; from: 1; to: 0; duration: 120 
    
    enter: Transition 
        NumberAnimation  property: "opacity"; from: 0; to: 1; duration: 120 
    

我正在尝试让背景淡出(就像弹出窗口本身一样,它有效)。为此,我为背景的 Rectangle 提供了 ID backdropDim。 但是,一旦模式关闭,Overlay.modal 就会消失,并且出现以下错误:

ReferenceError: backdropDim is not defined

我做错了什么? / 如何使背景消失并平滑过渡?

【问题讨论】:

【参考方案1】:

问题在于Overlay.modalComponent,它(在 C++ 术语中)就像一个类定义,而不是该类的实例。您正在尝试访问某个类的成员,但实际上并没有对该类的实例的引用。

解决此问题的最佳方法是拉出要更改的属性 (opacity),使其位于该组件定义之外:

Popup 
    // Maintain backdrop opacity outside of the modal component
    property real backdropOpacity: 1.0

然后在组件中使用该新属性:

        Rectangle 
            id: backdropDim

            color: backdropColor
            anchors.fill: parent
            opacity: backdropOpacity    // <--
        

最后还要在你的转换中使用该属性:

    exit: Transition 
        NumberAnimation  property: "opacity"; from: 1; to: 0; duration: 120 
        NumberAnimation  property: "backdropOpacity"; from: 1; to: 0; duration: 120 
    

更新:

Popup 对象通过更改其opacity 属性来隐藏/显示模态组件。因此,您可以通过使用 Behavior 而不是过渡轻松地为其设置动画。

    Overlay.modal: GaussianBlur 
        source: ShaderEffectSource 
            sourceItem: root.parent
            live: true
        
        radius: 10
        samples: radius * 2

        Rectangle 
            id: backdropDim

            color: backdropColor
            anchors.fill: parent
        

        Behavior on opacity 
            NumberAnimation 
                duration: 120
            
        

    

    exit: Transition 
        NumberAnimation  property: "opacity"; from: 1; to: 0; duration: 120 
    
    enter: Transition 
        NumberAnimation  property: "opacity"; from: 0; to: 1; duration: 120 
    

【讨论】:

这不起作用。背景在没有过渡的情况下立即消失 是的,你是对的。似乎Popup 在关闭时必须立即隐藏覆盖组件,出于某种原因忽略过渡。我会看看我是否能找到解决方法。我仍然希望这些信息有助于访问 Component 之外的属性值。 是的,可以,谢谢!你是怎么找到的?我没有发现它在任何地方都有记录,对我来说这看起来像是一个错误(或缺少文档)。还是你只是尝试随机的东西? 只是一个有根据的猜测,真的。我尝试查看文档,但找不到。我一开始以为它会改变visible 属性,但测试表明它的值从未改变。所以我认为它必须是opacity

以上是关于QML Popup Overlay.modal 过渡不起作用的主要内容,如果未能解决你的问题,请参考以下文章

QT Quick QML 实例之 Popup 弹出界面

QT Quick QML 实例之 Popup 弹出界面

QT Quick QML 实例之 Popup 弹出界面

如何在 QML 中动态创建 Popup

QML Popup,屏蔽其他控件,使除了Popup控件的其他控件不再响应

QML Popup:知道它是如何关闭的