我有一个相当奇怪的场景,如果我启动一个包含ListView
如果有一个中等复杂的委托和足够的项目来轻松超出可见区域,整个子窗口将在启动时立即关闭。
降低委托的复杂性将允许窗口打开,但随后快速滚动窗口ListView
会强行关闭它。
This SSCCE http://sscce.org/在我的笔记本电脑上触发效果,但在功能更强大的机器上,它可能只能在滚动时执行(或者委托可能需要更复杂):
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";
}
}
}
}
}
}
}
}
}
代码中似乎没有任何特定部分导致问题,删除any委托中对象的数量减少了子窗口关闭的可能性。
我添加了调试标签,因为我的主要问题是这个效果不产生调试输出。如果我在子窗口的销毁处理程序中添加一个断点(Component.onDestruction
)然后有一个堆栈条目指向model: roleModel
声明 - 但删除整个Repeater
并用复制粘贴等效项替换会产生相同的结果减去堆栈条目。
因此,如果有人知道如何从这个纯 QML 示例中获取更多信息,我将不胜感激。
正如 @BaCaRoZzo 所指出的,通过修改委托代码来改变行为似乎是一个不相关的附带问题。
真正的原因是因为事实证明你无法创建新的根上下文 https://wiki.qt.io/Qt_project_org_faq#How_can_I_create_multiple_toplevel_windows_in_QML.3F(即顶级窗口)来自 QML。当 Qt Quick Components 发布时,暗示这个问题将得到解决,但是博客文章 http://blog.qt.digia.com/blog/2011/08/26/toplevel-windows-and-menus-with-qt-quick/夸耀Window
没有明确说明这一点。创建一个新的Window
并经过null
为家长技术上有效,但结果似乎很不稳定。
值得庆幸的是,在我的情况下,我正在创建一个 QML/C++ 应用程序,因此我通过创建新的根上下文解决了这个问题Q_INVOKABLE
C++ 方面的方法。但如果您正在开发纯 QML 应用程序,那么您似乎就不那么幸运了。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)