Динамически добавлять элементы в 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 после того, как вы введете новую область для разделения.