Динамически добавлять элементы в SplitView в QML

Я работаю с QML, и я хочу добавить элементы в SplitView динамически, например. onMouseClick, но пока я не нашел ответа.

То, что я обнаружил до сих пор, заключается в том, что свойство SplitView имеет свойство по умолчанию, установленное для него в качестве первого дочернего свойства data. Поэтому я предполагаю, что я должен попытаться добавить новые динамически созданные компоненты с родительским набором этого дочернего элемента (splitView1.children[0]). К сожалению, это тоже не работает. Более того, число детей этого первого ребенка равно нулю после завершения загрузки компонента (похоже, что событие SplitLayout Component.onCompleted вызывает функцию, которая перемещает этих детей в другое место). Таким образом, добавленные дочерние элементы не отображают (и не реагируют на какие-либо свойства, связанные с макетом).

См. следующий фрагмент кода:

import QtQuick 2.1
import QtQuick.Controls 1.0
import QtQuick.Layouts 1.0

ApplicationWindow {
    width: 600
    height: 400

    SplitView {
        anchors.fill: parent

        Rectangle {
            id: column
            width: 200
            Layout.minimumWidth: 100
            Layout.maximumWidth: 300
            color: "lightsteelblue"
        }

        SplitView {
            id: splitView1
            orientation: Qt.Vertical
            Layout.fillWidth: true

            Rectangle {
                id: row1
                height: 200
                color: "lightblue"
                Layout.minimumHeight: 1
            }

//            Rectangle {               //I want to add Rectangle to splitView1 like this one, but dynamicly eg.onMouseClick
//                color: "blue"
//            }
        }
    }

    MouseArea {
        id: clickArea
        anchors.fill: parent
        onClicked: {
            console.debug("clicked!")
            console.debug("len: " + splitView1.__contents.length); // __contents is the SplitView default property - an alias to the first child data property

            var newObject = Qt.createQmlObject('import QtQuick 2.1; Rectangle {color: "blue"}',
                splitView1, "dynamicSnippet1"); //no effect

//            var newObject = Qt.createQmlObject('import QtQuick 2.1; import QtQuick.Layouts 1.0; Rectangle {color: "blue"; width: 50; height: 50}',
//                splitView1, "dynamicSnippet1"); //rectangle visible, but not in layout(?) - not resizeable
        }
    }
}

Есть ли способ сделать динамически созданные компоненты правильно отображаемыми в SplitView как статически добавленные?

Ответ 1

Похоже, что API не поддерживает динамическую вставку новых элементов. Даже если вы его заработаете, это будет взлом и может сломаться с будущими выпусками. Вам может потребоваться сворачивать свой собственный контроль, чтобы имитировать поведение, которое вы хотите. В идеале это должно подкрепляться какой-то моделью.

Ответ 2

Как и в QtQuick Controls 1.3, SplitView имеет addItem(item) method.

Ответ 3

вы должны использовать Loader для загрузки dinamicaly объектов. в обработчике onClicked вы должны объявить свойство sourceComponent для изменения источника Loader, что-то вроде этого:

ApplicationWindow {
width: 600
height: 400

SplitView {
    anchors.fill: parent

    Rectangle {
        id: column
        width: 200
        Layout.minimumWidth: 100
        Layout.maximumWidth: 300
        color: "lightsteelblue"
    }

    SplitView {
        id: splitView1
        orientation: Qt.Vertical
        Layout.fillWidth: true

        Rectangle {
            id: row1
            height: 200
            color: "lightblue"
            Layout.minimumHeight: 1
        }
     Loader {
         id:rect
     }


    }
}

MouseArea {
    id: clickArea
    anchors.fill: parent
    onClicked: {
        console.debug("clicked!")
        console.debug("len: " + splitView1.__contents.length) // __contents is the SplitView default property - an alias to the first child data property
        rect.sourceComponent = algo
    }
}

Component {
    id:algo
Rectangle {
    anchors.fill: parent
    color: "blue"
}
}
}

Ответ 4

Я увидел исходный код SplitView, он вычисляет каждую разделенную область, когда Component.onCompleted signal. Поэтому я считаю, что это ключевой момент. Независимо от того, как вы это делаете (вставка, динамическое создание). Область будет не reset после того, как вы введете новую область для разделения.