我有一个相当奇怪的场景,如果我启动一个包含ListView
的子窗口,其中包含一个中等复杂的委托,并且有足够多的项目可以轻松超过可见区域,整个子窗口将在启动时立即关闭。
降低委托的复杂性将允许窗口打开,但随后快速滚动ListView
将强行关闭它。
这个SSCCE触发了我的笔记本电脑的效果,但是在更强大的机器上,它可能只在滚动时执行(或者代表可能需要更复杂):
import QtQuick 2.3
import QtQuick.Window 2.0
Window {
width: 300
height: 200
Component.onCompleted: {
win.createObject( null );
}
Component {
id: win
Window {
width: 600
height: 400
visible: true
ListView {
id: view
anchors.fill: parent
model: 100
boundsBehavior: Flickable.StopAtBounds
clip: true
delegate: Rectangle {
width: view.width
height: 24
property int debugLevel: index % 3
property int timestamp: index * 1000
property int message: index
color: "darkgray"
Row {
anchors.fill: parent
Repeater {
id: delegateRepeater
property list< QtObject > roleModel: [
QtObject {
property string label: timestamp
property int itemWidth: 100
},
QtObject {
property string label: debugLevel
property int itemWidth: 100
},
QtObject {
property string label: message
property int itemWidth: view.width - 100 - 100
}
]
model: roleModel
Item {
width: itemWidth
anchors {
top: parent.top
bottom: parent.bottom
}
Text {
anchors {
fill: parent
leftMargin: 4
}
verticalAlignment: Text.AlignVCenter
text: label
elide: Text.ElideRight
}
Rectangle {
anchors {
top: parent.top
bottom: parent.bottom
right: parent.right
}
width: 1
visible: index != ( delegateRepeater.count - 1 )
color: "white";
}
}
}
}
}
}
}
}
}
似乎没有导致问题的代码的任何特定部分,删除代理中的任何对象会降低子窗口关闭的概率。
我已经添加了调试标记,因为我的主要问题是此效果不会产生调试输出。如果我在子窗口的销毁处理程序(Component.onDestruction
)中添加一个断点,那么有一个指向model: roleModel
语句的堆栈条目 - 但删除整个Repeater
并替换为复制粘贴的等价物产生相同的结果减去堆栈条目。
如果有人知道从这个纯粹的QML示例中获取更多信息的方法,我将不胜感激。
答案 0 :(得分:2)
如@BaCaRoZzo所述,通过修改委托代码来改变行为似乎是一个无关的问题。
真正的原因是因为它从QML中得到了cannot create new root contexts(即顶级窗口)。当Qt快速组件发布时,这被暗示解决,但blog post吹嘘Window
没有明确说明这一点。创建新的Window
并为父技术传递null
有效,但结果似乎非常不稳定。
值得庆幸的是,在我的情况下,我创建了一个QML / C ++应用程序,所以我通过在C ++端从Q_INVOKABLE
方法创建新的根上下文来解决这个问题。但是,如果你正在开发一个纯粹的QML应用程序,那么你似乎运气不好。