将常见对象作为QML中的列表保存

时间:2018-07-04 11:21:01

标签: qt architecture qml

我在QML中开发的应用程序中存在体系结构问题。请考虑下图:

enter image description here

有关该应用程序的一些事实:

  1. 我需要存储一个元素名称数组,这里是Orange,Apple和Banana。
  2. 元素的数量是固定的,在运行时不会改变。
  3. 尽管只有1个元素数组,但应该可以同时以不同的图形形式显示。在该示例中,元素曾经被表示为黄色正方形,而其他时候则表示为绿色三角形。它们不一定必须以相同的顺序显示。但是顺序在运行时也不会改变。

我想避免不必要的代码复制,因此,只想使用1个具有不同图形表示形式的列表。我在执行此操作时遇到问题。

希望能帮助您解决此问题。

2 个答案:

答案 0 :(得分:3)

我不太了解OP想要归档的内容,但是我想您需要该模型。 这是一个可重用模型的简单示例:

import QtQuick 2.11
import QtQuick.Window 2.2
import QtQuick.Controls 2.2

Window {
    visible: true
    width: 600
    height: 400
    title: qsTr("Model example")

    ListModel {
        id:  myModel;
        ListElement { name: "Apple" }
        ListElement { name: "Orange" }
        ListElement { name: "Banana" }
    }

    Repeater {
        model: myModel
        delegate: type1
    }

    Repeater {
        model: myModel
        delegate: type2
    }

    ListView {
        model: myModel
        delegate: Text { text: name; height: 30; }
        width: 100
        height: 200
    }

    ComboBox {
        width: 100
        y: 200
        model: myModel
    }

    Component {
        id: type1
        Canvas {
            x: 100 + Math.round(Math.random() * 400)
            y: Math.round(Math.random() * 100)
            rotation: Math.round(Math.random() * 360)
            antialiasing: true
            width: 100
            height: 100
            onPaint: {
                var ctx = getContext("2d");
                ctx.fillStyle = "#00DD00";
                ctx.beginPath();
                ctx.moveTo(50, 0);
                ctx.lineTo(100, 100);
                ctx.lineTo(0, 100);
                ctx.fill();
            }
            Text {
                anchors.centerIn: parent
                text: name
            }
        }
    }

    Component {
        id: type2
        Rectangle {
            x: 100 + Math.round(Math.random() * 400)
            y: 200 + Math.round(Math.random() * 100)
            rotation: Math.round(Math.random() * 360)
            antialiasing: true
            width: 100
            height: 100
            color: "orange"
            Text {
                anchors.centerIn: parent
                text: name
            }
        }
    }
}

答案 1 :(得分:0)

欢迎,只有在我有足够的声誉时才能发表评论,但是您不能仅使用QAbstractListModel吗?然后,您可以使用两个路径视图来确定对象的位置。这是example,但是您将拥有自己的QAbstractListModel而不是示例ListModel。代表将确定项目的形状。

在QML的ListModel上使用QAbstractListModel的原因是因为ListModel是在运行时创建的。