代码中的QML ListView部分

时间:2014-12-14 15:14:23

标签: python qt listview pyqt qml

我无法使用部分实现listview。我已成功重复了Qt文档中的示例,但使用了ListModel可以正常使用,但不是var

如何使用示例:

ListView {
    width: 100
    height: 100
    id: listview
    model: ListModel {
        id: animalsModel
        ListElement { name: "Ant"; size: "Tiny" }
        ListElement { name: "Flea"; size: "Tiny" }
        ListElement { name: "Parrot"; size: "Small" }
        ListElement { name: "Guinea pig"; size: "Small" }
        ListElement { name: "Rat"; size: "Small" }
        ListElement { name: "Butterfly"; size: "Small" }
        ListElement { name: "Dog"; size: "Medium" }
        ListElement { name: "Cat"; size: "Medium" }
        ListElement { name: "Pony"; size: "Medium" }
        ListElement { name: "Koala"; size: "Medium" }
        ListElement { name: "Horse"; size: "Large" }
        ListElement { name: "Tiger"; size: "Large" }
        ListElement { name: "Giraffe"; size: "Large" }
        ListElement { name: "Elephant"; size: "Huge" }
        ListElement { name: "Whale"; size: "Huge" }
    }

    delegate: Text { text: name; font.pixelSize: 18 }

    section.property: "size"
    section.criteria: ViewSection.FullString
    section.delegate: Component {
        id: sectionHeading
        Rectangle {
            width: container.width
            height: childrenRect.height
            color: "lightsteelblue"

            Text {
                text: section
                font.bold: true
                font.pixelSize: 20
            }
        }
    }
}

GUI qt example

但是,当我尝试使用代码中的某些模型时(在我的情况下,它是来自QVariant的{​​{1}}),它根本不起作用:

PyQt5

我在这里选择ListView { width: 100 height: 100 id: listview property var m: [ { name: "Animal", size: "Big" }, { name: "Dog", size: "Small" }, { name: "Cat", size: "Small" } ] model: m delegate: Text { text: modelData.name; font.pixelSize: 18 } section.property: "modelData.size" section.criteria: ViewSection.FullString section.delegate: Component { id: sectionHeading Rectangle { width: container.width height: childrenRect.height color: "lightsteelblue" Text { text: section font.bold: true font.pixelSize: 20 } } } } 的原因是因为没有任何其他方法可以从Python接收模型,因此需要包含来自var的任何listmappython

1 个答案:

答案 0 :(得分:2)

来自Qt文档:

型号型号

This property holds the model providing data for the list. The model provides the set of data that is used to create the items in the view. Models can be created directly in QML using ListModel, XmlListModel or VisualItemModel, or provided by C++ model classes. If a C++ model class is used, it must be a subclass of QAbstractItemModel or a simple list.

所以你不能提供一个数组作为模型,它应该是上面的一个对象。 您可以创建此类模型并从Python代码访问它以添加/删除项目。

ListView {
    width: 100
    height: 100
    id: listview
    delegate: Text { text: name; font.pixelSize: 18 }

    model: ListModel { id: listModel }

    section.property: "size"
    section.criteria: ViewSection.FullString
    section.delegate: Component {
        id: sectionHeading
        Rectangle {
            width: container.width
            height: childrenRect.height
            color: "lightsteelblue"

            Text {
                text: section
                font.bold: true
                font.pixelSize: 20
            }
        }
    }

    function callFromPython {
        listModel.append({name: "Animal",size: "Big"});
        listModel.append({name: "Dog",size: "Small"});
        listModel.append({name: "Cat",size: "Small"});
    }
}