Хранение общих объектов в виде списка в QML - PullRequest
0 голосов
/ 04 июля 2018

У меня возникла архитектурная проблема в приложении, которое я разрабатываю в QML. Пожалуйста, обратите внимание на следующую цифру:

enter image description here

Некоторые факты о приложении:

  1. Мне нужно хранить массив имен элементов, здесь это Orange, Apple и Banana.
  2. Количество элементов фиксировано и не изменится во время выполнения.
  3. Хотя существует только 1 массив элементов, должна быть возможность представлять их в разных графических формах одновременно. В этом примере элементы представлены в виде желтых квадратов, а в другой раз - в виде зеленых треугольников Они не обязательно должны быть показаны в том же порядке. Но порядок также не меняется во время выполнения.

Я хочу избежать ненужного копирования кода, поэтому хотел использовать только 1 список с разными графическими представлениями. У меня возникли проблемы с реализацией этого, однако.

Буду признателен за помощь в решении этой проблемы.

Ответы [ 2 ]

0 голосов
/ 05 июля 2018

Я не совсем понимаю, что ОП хочет архивировать, но, думаю, эта модель - то, что вам нужно. Это простой пример многоразовой модели:

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
            }
        }
    }
}
0 голосов
/ 04 июля 2018

Welp, не можете комментировать, пока у меня не будет достаточно репутации, но вы не можете просто использовать QAbstractListModel для этого? Затем вы можете использовать два вида пути, которые определяют, куда идут объекты. Вот пример , но у вас будет свой собственный QAbstractListModel вместо примеров ListModel. Делегат определит форму предметов.

Причина использования QAbstractListModel над ListModel в QML заключается в том, что ListModel создается во время выполнения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...