子窗口中的ListView触发立即关闭或滚动时

时间:2014-12-18 22:34:07

标签: qt debugging qml qt-quick

我有一个相当奇怪的场景,如果我启动一个包含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示例中获取更多信息的方法,我将不胜感激。

1 个答案:

答案 0 :(得分:2)

如@BaCaRoZzo所述,通过修改委托代码来改变行为似乎是一个无关的问题。

真正的原因是因为它从QML中得到了cannot create new root contexts(即顶级窗口)。当Qt快速组件发布时,这被暗示解决,但blog post吹嘘Window没有明确说明这一点。创建新的Window并为父技术传递null有效,但结果似乎非常不稳定。

值得庆幸的是,在我的情况下,我创建了一个QML / C ++应用程序,所以我通过在C ++端从Q_INVOKABLE方法创建新的根上下文来解决这个问题。但是,如果你正在开发一个纯粹的QML应用程序,那么你似乎运气不好。