QML中代理中的组件

时间:2017-03-22 10:45:43

标签: qt qml qtquick2

我想知道将一个组件放在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 myPageDelegatePrototype中有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。

0 个答案:

没有答案