【发布时间】:2017-03-10 15:51:15
【问题描述】:
简而言之,我在做什么:
- 我有一个名为
snapshotItem和live: false的ShaderEffectSource项目 - 动态实例化一个名为
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
}
}
}
【问题讨论】:
-
遵循简单的逻辑,禁用 live 并分配一个虚拟对象就足以让它按照您想要的方式工作,事实上,仅第一件事就足够了。然而,这就是 Qt,它并不总是遵循逻辑,实际上很多时候它并不遵循逻辑。随意提交错误报告,并可能在多年后看到此修复:D