我如何在 qml 中為 ListView 使用不同的委托。例如我有 QList<SomeObject*> 串列,SomeObject 有兩個欄位:型別(圓形、矩形等)和 someValue。我為這個串列創建了 QListModel。我有不同的 qml 元素(circle.qml、 rectangle.qml 等)。如何按型別查看專案的委托,并在此委托中查看欄位 someValue。我可以在沒有表格/串列的情況下定位這些代表嗎,我想通過坐標(x,y)來定位它們。
uj5u.com熱心網友回復:
- 您可以嘗試一個可能符合您要求的 qml Loader 概念。基本上,您不能為單個視圖定義多個委托。因此,將您的 Top Delegate 設定為加載程式并根據型別加載專案將幫助您解決這種情況。
- 定位也是可能的,您可以使用模型資料定義 x & y pos。這樣您就可以相應地對齊您的視圖項。在這種情況下,我使用了 Scrollview Repeater
在這里分享了一個最小的樣本。為簡單起見,我使用 Qml ListModel 保存了我的資料。對來自 c 模型的物件也可以這樣做。 這里也提供了作為 Qt 解決方案專案的源代碼。
// ShapeModel.qml //
import QtQuick 2.15
import QtQml.Models 2.15
ListModel {
ListElement {
type: "circle"
val: "100"
xpos: 10
ypos: 10
}
ListElement {
type: "rectangle"
val: "30"
xpos: 100
ypos: 100
}
ListElement {
type: "circle"
val: "150"
xpos: 300
ypos: 450
}
ListElement {
type: "rectangle"
val: "20"
xpos: 500
ypos: 200
}
ListElement {
type: "circle"
val: "25"
xpos: 650
ypos: 100
}
ListElement {
type: "rectangle"
val: "60"
xpos: 600
ypos: 200
}
}
// main.qml //
import QtQuick 2.15
import QtQuick.Window 2.15
import QtQuick.Controls 2.15
Window {
width: 640
height: 480
visible: true
title: qsTr("Qt MVC")
Component {
id: componentCircleId
Rectangle {
border.color: "blue"
border.width: 1
height: value
width: value
radius: value/2
}
}
Component {
id: componentRectangleId
Rectangle {
border.color: "orange"
border.width: 1
height: value
width: value
}
}
Component {
id: componentLoaderId
Loader {
property real value: val
x: xpos
y: ypos
sourceComponent: type === "circle" ?
componentCircleId : componentRectangleId
}
}
ScrollView {
id: scrollviewId
anchors.fill: parent
Repeater {
anchors.fill: parent
model: ShapeModel{}
delegate: componentLoaderId
onItemAdded: {
// scroll area computation
// Better solutions may be available
if(item.x item.width > scrollviewId.contentWidth)
scrollviewId.contentWidth = item.x item.width
if(item.y item.height > scrollviewId.contentHeight)
scrollviewId.contentHeight = item.y item.height
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/335100.html
