@TriKrista

Как расположить элементы из ListModel(QML) в строго определенных местах?

В общем, задача такая: надо расположить в окне программы (интерфейс реализован через QML), в определенных координатах, элементы. Координаты элементов и их количество в начальный момент не известны.
Вся информация об элементах доступна через ListModel.

В общем, я решил проблему, примерно так:
//main.qml
import QtQuick 2.3

Item {
    id: item
    width: 500
    height: 500

    function addItems() {
        for (var i = 0; i < mainModel.count; i++) {
            var component = Qt.createComponent("RectItem.qml");
            if (component.status === Component.Ready) {
                var childRec = component.createObject(item);
                childRec.x = mainModel.get(i).x;
                childRec.y = mainModel.get(i).y;
                childRec.color = mainModel.get(i).color;
            }
        }
    }

    ListModel {
        id: mainModel
        ListElement {
            x: 100
            y: 110
            color: "#123"
        }
        ListElement {
            x: 450
            y: 90
            color: "#a63"
        }
        ListElement {
            x: 90
            y: 400
            color: "#c13"
        }
        ListElement {
            x: 120
            y: 200
            color: "#543"
        }
        ListElement {
            x: 300
            y: 177
            color: "#fc3"
        }
    }

    MouseArea {
        id: mouse
        anchors.fill: parent
        onClicked: addItems()
    }
}

// RectItem.qml
import QtQuick 2.0

Rectangle {
    width: 50
    height: 50
    radius: 25
    color: "#a33"
}
  • Вопрос задан
  • 3062 просмотра
Решения вопроса 1
@novikovbogdan
Я не совсем понял, надо ли добавлять элементы по одному. Если нет, то я сделал бы так:
Repeater {
            model: mainModel
            anchors.fill: parent
            Rectangle {
                width: 100
                height: 100
                color: model.color
                z: index
                x: model.x
                y: model.y
                MouseArea {
                    anchors.fill: parent
                    onClicked: Qt.quit()
                }
            }
        }


Если же надо добавлять элементы динамически, то:

Repeater {
            id: repeater
            model: mainModel
            anchors.fill: parent
            property int counter: 0
            Rectangle {
                width: 100
                height: 100
                color: model.color
                visible: index<=repeater.counter
                z: index
                x: model.x
                y: model.y
                MouseArea {
                    anchors.fill: parent
                    onClicked: {
                        repeater.counter++
                    }
                }
            }
        }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@xseven
Умение формулировать вопрос эт оуже 70% успеха и возрастание вероятности получить ответ почти до единцы.

Данный вопрос выглядит как: "что вы больше меньше всего любите потому что за позавчера?"

В общем виде если модель не отображается напрямую однозначно (разное количество элементов, какие-то особые критерии отображения и т.д.), то желательно использовать одну из моделей прослоек (QIdentityProxyModel, QSortingProxyModel и т.д.)

Если вы сформулируете ваш вопрос более конкретно, то будет легче ответить предметно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы