如何在 QML 视图之间动态更改

Posted

技术标签:

【中文标题】如何在 QML 视图之间动态更改【英文标题】:How to change between QML views dynamically 【发布时间】:2020-04-16 07:11:05 【问题描述】:

我想要实现的行为是通过从下拉框中进行选择,您将看到一个不同的 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"
    

香蕉.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】:

考虑这段代码:

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

【讨论】:

谢谢! 好答案。在这种情况下,当您想在来回切换时保留状态(而不是在每次切换时重新实例化组件)时,StackLayout 也很有用。

以上是关于如何在 QML 视图之间动态更改的主要内容,如果未能解决你的问题,请参考以下文章

QML StackView:动态更改replaceEnter/Exit动画

如何在 QML 中进行基于状态的模型更改

如何在 QML 中创建动态委托?

如何在 2 个 qml 窗口之间进行通信

如何使用QML StackView的status属性?

在运行时动态更改 QML 主题