如何在QML ListView中可见项目更改时禁用动态对象管理?

7

我有一个 QML ListView,其中委托是真正的 C++,附加到设备组件,使用线程和 QWidgets

但是当我滚动 ListView 或将委托展开到程序窗口时 - 不可见的委托会被销毁。

我该怎么做才能保存我的 ListModel 中的委托?

我的示例代码:

    import Qt 4.7

    Rectangle {
    width: 320; height: 200; color: "white"
    Text {
        id: debugText
        font.pixelSize: 24
        color:"blue"
        text: "count of created delegates: " + added.toString()
    }
    property int added: 0
    Component {
        id: delegate
        Item {
            id: wrapper
            Component.onCompleted: added += 1
            width: 180; height: 50
            Column {
                x: 5; y: 5
                Text { text: '<b>Name:</b> ' + name }
                Text { text: '<b>Number:</b> ' + number }
            }
        }
    }
    ListView {
        width: parent.width; height: parent.height
        model: contactModel
        delegate: delegate
    }

    ListModel {
        id: contactModel
        ListElement {
            name: "Bill Smith"
            number: "555 3264"
        }
        ListElement {
            name: "John Brown"
            number: "555 8426"
        }
        ListElement {
            name: "Sam Wise"
            number: "555 0473"
        }
        ListElement {
            name: "Bill Smith"
            number: "555 3264"

        }
        ListElement {
            name: "John Brown"
            number: "555 8426"
        }
        ListElement {
            name: "Sam Wise"
            number: "555 0473"
        }
    }
}

谢谢!我解决了问题!第一种方法是,我创建了一个Flickable对象、Column和Repeater,这个解决方案适合我。第二种方法是,在主视图中使用多个网格(类似SCADA程序),我使用QObjectList,在其中每个对象都是我的DataObject :)

1个回答

5
您可以通过将ListView的cacheBuffer属性(http://doc-snapshot.qt-project.org/4.8/qml-listview.html#cacheBuffer-prop)分配一个大值来防止其销毁委托。这显然是一种hack方法,并不推荐使用。在委托中存储任何状态都是不好的做法。
相反,您应该在C++模型中单独管理本机对象,以便您可以根据需要控制每个对象的生命周期。

属性 cacheBuffer:整数 - ctinka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接