我想知道将一个组件放在ListView
考虑一下:
DelegatePrototype.qml
MouseArea {
property Component myPage
onClicked: {
myPageLoader.sourceComponent = myPage
myPageLoader.pageData = model
}
}
和 main.qml
import QtQuick 2.7
import QtQuick.Controls 2.0
ApplicationWindow {
id: appWindow
width: 1024
height: 800
visible: true
Loader {
id: myPageLoader
x: 100
active: true
property var pageData
}
Component {
id: myDelegate
DelegatePrototype {
width: 100
height: 50
myPage: Rectangle {
width: 400
height: 800
color: 'steelblue'
Column {
Text {
text: pageData.name
}
Row {
spacing: 4
Repeater {
model: pageData.age
delegate: Rectangle {
color: 'red'
width: 7
height: 30
}
}
}
}
}
Text {
anchors.centerIn: parent
text: model.name
}
}
}
ListView {
width: 100
height: 800
model: ListModel {
ListElement { name: 'Herbert'; age: 5 }
ListElement { name: 'Hans'; age: 3 }
ListElement { name: 'Ludwig'; age: 12 }
ListElement { name: 'Franz'; age: 9 }
ListElement { name: 'Peter'; age: 2 }
ListElement { name: 'Karl'; age: 15 }
}
delegate: myDelegate
}
}
对于这个问题:我在property Component myPage
和DelegatePrototype
中有main.qml
我为其分配了一个组件,我在运行中声明了 。
我可能事先明确地声明了一个组件,然后像这样分配它:
Component {
id: myPageDelegate
Rectangle {
width: 400
height: 800
color: 'steelblue'
Column {
Text {
text: pageData.name
}
Row {
spacing: 4
Repeater {
model: pageData.age
delegate: Rectangle {
color: 'red'
width: 7
height: 30
}
}
}
}
}
}
Component {
id: myDelegate
DelegatePrototype {
width: 100
height: 50
myPage: myPageDelegate
Text {
anchors.centerIn: parent
text: model.name
}
}
}
虽然我相信后一种情况,但我的内存中只有一个Component
- myPage
对象,并且对于每个实例化的DelegatePrototype
只有一个对此的引用,我可能会想到,在前一种情况下,我可能会为Component
的每个实例为myPage
创建一个DelegatePrototype
- 对象,这可能会使内存与Component
相同。 - 对象很快。
我的假设是否在这里,我应该避免分配那些即时 - Components
的声明,还是QML会为我优化这个?
我知道,有crossfile-references(myPageLoader是从DelegatePrototype引用的)但是对于这个问题,我认为没有必要解释为什么我选择使用这个crossfile-reference。