Как динамически переключаться между представлениями QML - PullRequest
0 голосов
/ 16 апреля 2020

Я хочу добиться поведения, выбрав в раскрывающемся списке другой компонент 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_())

1 Ответ

2 голосов
/ 16 апреля 2020

Рассмотрите этот код:

ColumnLayout {

    ComboBox {
        id: selector

        model: ListModel {
            id: cbItems
            ListElement { text: "Apple"; }
            ListElement { text: "Banana"; }
        }

        onCurrentIndexChanged: {
            viewer.source = cbItems.get(currentIndex).text + ".qml";
        }
    }

    Loader {
        y: 50
        id: viewer
        source: "Apple.qml"

        onSourceChanged: {
            console.log(source);
        }
    }
}

Для достижения вашей цели достаточно одинокого Loader. Однако вы можете разместить его где угодно, например. в ListView.

...