@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"
}
  • Вопрос задан
  • 3061 просмотр
Решения вопроса 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 и т.д.)

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

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

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 05:01
999999 руб./за проект
19 апр. 2024, в 03:52
1000 руб./за проект
19 апр. 2024, в 03:01
1000 руб./за проект