Qt/QML:如何从 GridView 模型的 ListElement 引用 component/object
Qt/QML: How to refer to a component/object from a GridView's model's ListElement
我有一个 GridView
和一个委托,它应该使用 Loader
来加载和显示在同一个 QML 文件中定义的组件。
假设我有一个这样的 GridView:
GridView {
delegate: Rectangle {
Loader { sourceComponent: model.pageContents }
}
model: ListModel {
ListElement { /* how do I reference any of the components defined below from here, so the Loader can actually load and display it... ? */ }
}
}
Component {
id: page_01
Rectangle {
color: "red"
// Page contents for page 1 go here.
}
}
Component {
id: page_02
Rectangle {
color: "red"
// Page contents for page 2 go here.
}
}
我知道我可以从字符串、外部文件和 URL 创建 QML 对象和组件。但我想理想地做这样的事情:
ListModel {
ListElement { pageContents: page_01 }
ListElement { pageContents: page_02 }
}
我更愿意将所有内容都保存在一个 QML 文件中,这样我就可以轻松地将其传输并存储在设备上,而不必担心解决外部依赖性等问题
如何从 ListElement
s 中引用同一个 QML 文件中的组件?
由于 ListElement
值的限制,您不能只将项目 id
放在这里。但是您可以轻松地使用一些外部存储,例如 属性 来存储指向您的页面的指针。在下面的示例中,我使用带有页面 id
s 的数组和所需页面的索引作为 ListElement
数据:
import QtQuick 2.3
import QtQuick.Window 2.2
Window {
visible: true
width: 600
height: 600
GridView {
id: grid
anchors.fill: parent
property var pages: [page_01, page_02]
model: ListModel {
ListElement { pageIndex: 0 }
ListElement { pageIndex: 1 }
}
delegate: Loader { sourceComponent: grid.pages[pageIndex] }
}
Component {
id: page_01
Rectangle {
color: "red"
width: 100
height: 100
Component.onCompleted: console.log("page_01 was created")
}
}
Component {
id: page_02
Rectangle {
color: "blue"
width: 100
height: 100
Component.onCompleted: console.log("page_02 was created")
}
}
}
我有一个 GridView
和一个委托,它应该使用 Loader
来加载和显示在同一个 QML 文件中定义的组件。
假设我有一个这样的 GridView:
GridView {
delegate: Rectangle {
Loader { sourceComponent: model.pageContents }
}
model: ListModel {
ListElement { /* how do I reference any of the components defined below from here, so the Loader can actually load and display it... ? */ }
}
}
Component {
id: page_01
Rectangle {
color: "red"
// Page contents for page 1 go here.
}
}
Component {
id: page_02
Rectangle {
color: "red"
// Page contents for page 2 go here.
}
}
我知道我可以从字符串、外部文件和 URL 创建 QML 对象和组件。但我想理想地做这样的事情:
ListModel {
ListElement { pageContents: page_01 }
ListElement { pageContents: page_02 }
}
我更愿意将所有内容都保存在一个 QML 文件中,这样我就可以轻松地将其传输并存储在设备上,而不必担心解决外部依赖性等问题
如何从 ListElement
s 中引用同一个 QML 文件中的组件?
由于 ListElement
值的限制,您不能只将项目 id
放在这里。但是您可以轻松地使用一些外部存储,例如 属性 来存储指向您的页面的指针。在下面的示例中,我使用带有页面 id
s 的数组和所需页面的索引作为 ListElement
数据:
import QtQuick 2.3
import QtQuick.Window 2.2
Window {
visible: true
width: 600
height: 600
GridView {
id: grid
anchors.fill: parent
property var pages: [page_01, page_02]
model: ListModel {
ListElement { pageIndex: 0 }
ListElement { pageIndex: 1 }
}
delegate: Loader { sourceComponent: grid.pages[pageIndex] }
}
Component {
id: page_01
Rectangle {
color: "red"
width: 100
height: 100
Component.onCompleted: console.log("page_01 was created")
}
}
Component {
id: page_02
Rectangle {
color: "blue"
width: 100
height: 100
Component.onCompleted: console.log("page_02 was created")
}
}
}