Qt QML 动态改变页面的项目

Qt QML change item of a page dynamically

我有 BasePage.qml 这样的:

Item {
    property alias content: loader.sourceComponent
    signal topBarLeftButtonClicked()

    TopBar {
    ...
    }

    Loader {
        id: loader
    }

    BottomBar {
    ...
    }
}

这样我可以动态改变页面的内容,但我必须使用组件,而且我无法读取 DerivedPage 中内容的属性。
例如:

DerivedPage.qml

BasePage {
    onTopBarLeftIconClicked: item.text //error, item is not defined

    content: Component {
        TextField {
            id: item
        }
    }
}

有什么解决办法吗?

您可以在 BasePage 中定义 Loaderitem 属性 的别名,例如:

property alias contentItem: loader.item

并在 DerivedPage.

中引用它而不是 content item

综合起来:

// BasePage.qml
Item {
    property alias content: loader.sourceComponent
    property alias contentItem: loader.item
    signal topBarLeftButtonClicked()
    Loader { id: loader }
}

// DerivedPage.qml
BasePage {
    onTopBarLeftIconClicked: { contentItem.text = "clicked" }
    content: Component { TextField { } }
}

我找到了替换加载器和组件的方法:

//BasePage.qml
Item {
    default property alias data: item.data
    signal topBarLeftButtonClicked()

    TopBar {
    ...
    }

    Item{
        id: item
    }

    BottomBar {
    ...
    }
}

//DerivedPage.qml
BasePage {
    onTopBarLeftIconClicked: textField.text = "string"

    TextField {
        anchors.fill: parent
        id: textField
    }
}

这样 textField 替换 BasePage.qml

中的项目