我在做什么,简而言之:
ShaderEffectSource
名为snapshotItem
且live: false
dynamicItem
snapshotItem.sourceItem = dynamicItem
snapshotItem.scheduleUpdate()
dynamicItem
的两份副本snapshotItem.sourceItem
设置为空的虚拟物品,以使下一步不太可能导致问题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
}
}
}
答案 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
}
}
}