如何从外部函数访问TabView中的QML元素?

时间:2016-01-08 12:15:39

标签: javascript qt qml

在我的QML应用程序中,我有一个TabView,Tabs和一些按钮和文本字段。我需要使用外部TabView组件中的自定义函数来访问它们,这些组件是从Tab内部的按钮调用的。

我的代码非常简单:

ApplicationWindow {
    function showText() {
        console.log(tabView.testText);
    }

    TabView {
        id: tabView

        property alias testText: test.text

        Tab {
            title:'tab1'

            RowLayout {
                Button {
                    text:"PRINT"

                    onClicked: {
                        showText()
                    }
                }

                Text {
                    id:test
                    text:'Test123'
                }
            }
        }

        Tab {
            title:'tab2'
        }
    }
}

但是我收到了别名创建行的错误消息:

 Invalid alias reference. Unable to find id "test"

它出了什么问题?我在SO(ReferenceError in qt quick controls tabview)上关注了类似的问题,但代码也没有。

2 个答案:

答案 0 :(得分:0)

我认为你应该添加一个这样的别名:

TabView {
    id: tabView

    property var testText: { return getTab(0).tab1Text }

    Tab {
        id: tab1
        title:'tab1'

        property alias tab1Text: test.text

        RowLayout {
            Button {
                text:"PRINT"

                onClicked: {
                    showText()
                }
            }

            Text {
                id:test
                text:'Test123'
            }
        }
    }

    Tab {
        title:'tab2'
    }
}

答案 1 :(得分:0)

正如this回答中提到的,Tab基本上是Loader,这意味着您尝试通过别名访问的属性可能尚未加载。 alias有一些strict requirements,其中一个是“仅在组件完全初始化后才会激活”

由于您在show()内尝试访问Tab方法,因此您只需传递所需的数据:

import QtQuick 2.4
import QtQuick.Controls 1.3
import QtQuick.Extras 1.3
import QtQuick.Layouts 1.1

ApplicationWindow {
    width: 300
    height: 600
    visible: true

    function showText(text) {
        console.log(text)
    }

    TabView {
        id: tabView

        Tab {
            title: 'tab1'

            RowLayout {
                Button {
                    text: "PRINT"

                    onClicked: {
                        showText(text)
                    }
                }

                Text {
                    id: test
                    text: 'Test123'
                }
            }
        }

        Tab {
            title: 'tab2'
        }
    }
}