Я хочу добиться поведения, выбрав в раскрывающемся списке другой компонент QML. Таким образом, если пользователь выбирает «Apple», то компонент Apple будет просматриваться, в противном случае будет отображаться компонент «Banana». Пока что мой подход заключается в использовании ListView с делегатом Loader следующим образом, однако мои компоненты не отображаются вообще. Есть ли лучший способ добиться того поведения, за которым я следую?
view.qml
import QtQuick 2.0
import QtQuick.Layouts 1.12
import QtQuick.Controls 2.12
import QtQuick.Window 2.12
ApplicationWindow {
id: page
width: 400
height: 400
visible: true
ColumnLayout {
ListModel {
id: nullmodel
}
ComboBox {
id: selector
currentIndex: 1
model: ListModel {
id: cbItems
ListElement { text: "Apple"; }
ListElement { text: "Banana"; }
}
onCurrentIndexChanged: viewer.selected = cbItems.get(currentIndex).text
}
ListView {
model: nullmodel
id: viewer
property string selected: "Apple"
delegate: Loader {
sourceComponent: {
switch(selected)
{
case "Apple": {
console.log("Apples!")
return Apple
}
case "Banana": {
console.log("Bananas!")
return Banana
}
default:
console.log("Neither")
return Apple
}
}
}
}
}
}
Apple.qml
import QtQuick 2.0
Item {
Text {
text: "Hi, I'm an Apple"
}
}
Banana.qml
import QtQuick 2.0
Item {
Text {
text: "Hi, I'm a Banana"
}
}
Если это имеет какое-либо значение, я ' используя PySide2 для отображения
main.py
import sys
from os.path import abspath, dirname, join
from PySide2.QtCore import QObject, Slot
from PySide2.QtGui import QGuiApplication
from PySide2.QtQml import QQmlApplicationEngine
if __name__ == '__main__':
app = QGuiApplication(sys.argv)
engine = QQmlApplicationEngine()
qmlFile = join(dirname(__file__), 'view.qml')
engine.load(abspath(qmlFile))
if not engine.rootObjects():
sys.exit(-1)
sys.exit(app.exec_())