销毁设置为ShaderEffectSource的sourceItem的Item也会隐藏ShaderEffectSource

时间:2017-03-10 15:51:16

标签: qt qml qtquick2

我在做什么,简而言之:

  • 我有ShaderEffectSource名为snapshotItemlive: false
  • 的项目
  • 动态实例化名为dynamicItem
  • 的项目
  • 设置snapshotItem.sourceItem = dynamicItem
  • 致电snapshotItem.scheduleUpdate()
  • 此时,我在屏幕上成功看到dynamicItem的两份副本
  • 在任何钥匙上,我:
    • snapshotItem.sourceItem设置为空的虚拟物品,以使下一步不太可能导致问题
    • destroy dynamicItem

问题在于,当按下某个键时,当我想要保留snapshotItem时,两个副本都会从屏幕上消失。

注意:如果您对想要实现此目标的动机感兴趣,请参阅my previous question

我的代码:

import QtQuick 2.6
import QtQuick.Window 2.2

Window {
    visible: true
    width: 640
    height: 480

    property int childWidth: 100
    property int childHeight: 100

    id: root
    property var dynamicItem

    Item {
        id: dummy
    }

    Component {
        id: dynamicItemComponent
        Rectangle {
            color: "red"
        }
    }

    Component.onCompleted: {
        dynamicItem = dynamicItemComponent.createObject(row);
        dynamicItem.width = childWidth;
        dynamicItem.height = childHeight;
        snapshotItem.sourceItem = dynamicItem;
        snapshotItem.scheduleUpdate();
    }

    Item {
        focus: true
        Keys.onPressed: {
            snapshotItem.sourceItem = dummy;
            dynamicItem.destroy();
        }
    }

    Row {
        id: row
        spacing: 10
        ShaderEffectSource {
            id: snapshotItem
            live: false
            width: childWidth
            height: childHeight
        }
    }
}

1 个答案:

答案 0 :(得分:1)

您无需使用dummyItem。您可以将sourceItem设置为ShaderEffectSource本身。

也许您应该将recursive设置为true,但如果没有它,它也可以。

import QtQuick 2.6
import QtQuick.Window 2.2

Window {
    visible: true
    width: 640
    height: 480

    property int childWidth: 100
    property int childHeight: 100

    id: root
    property var dynamicItem

    Component {
        id: dynamicItemComponent
        Rectangle {
            color: "red"
        }
    }

    Component.onCompleted: {
        dynamicItem = dynamicItemComponent.createObject(row);
        dynamicItem.width = childWidth;
        dynamicItem.height = childHeight;
        snapshotItem.sourceItem = dynamicItem;
        snapshotItem.scheduleUpdate();
    }

    Item {
        focus: true
        Keys.onPressed: {
            snapshotItem.sourceItem = snapshotItem;
            dynamicItem.destroy();
        }
    }

    Row {
        id: row
        spacing: 10
        ShaderEffectSource {
            id: snapshotItem
            live: false
            // recursive: sourceItem === this
            width: childWidth
            height: childHeight
        }
    }
}