我正在使用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's default property - an alias to the first child's 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
中正确呈现为静态添加的组件?
答案 0 :(得分:3)
似乎API不支持动态插入新元素。即使你确实让它工作,它也会成为一个黑客,可能会打破未来的版本。您可能需要滚动自己的控件来模仿所需的行为。理想情况下,它应该由某种模型支持。
答案 1 :(得分:3)
自QtQuick Controls 1.3起,SplitView
有一个addItem(item)
method。
答案 2 :(得分:0)
您必须使用Loader来加载动态对象。在onClicked句柄中你必须声明源Component属性来改变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's default property - an alias to the first child's data property
rect.sourceComponent = algo
}
}
Component {
id:algo
Rectangle {
anchors.fill: parent
color: "blue"
}
}
}
答案 3 :(得分:0)
我看到了SplitView的源代码,它在Component.onCompleted信号时计算每个分割区域。所以我认为这是关键点。无论你怎么做(插入,动态创建)。插入新区域进行拆分后,区域不会重置。