从另一个QML文件访问TextField

时间:2019-03-23 14:30:42

标签: qt qml

我有两个.qml文件:

CustomText.qml

Item 
{
    TextField
    {
        id: t1
        placeholderText: qsTr("Enter name")
    }
}

main.qml

Window 
{
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    CustomText {width: 200; height: 200}

    Rectangle
    {
        id: r1      
        border.color: "black"
        width: 200
        height: 200
        x: 200
        y: 200
        Text 
        {
            text: t1.text
        }
    }
}

此代码不起作用,因为该ID未知。如何从TextField中的main.qml访问文本?

1 个答案:

答案 0 :(得分:2)

有两种方法可以完成此操作,即

  1. 别名t1.text,绑定customText.text
  2. 别名t1,绑定customText.t1.text

请注意,在这两种方法中,我们都需要为您的id实例提供CustomText,以便我们可以引用它。在这两种方法中,我们还将使用property aliases。这些使您可以公开CustomText的某些属性。

别名t1.text,已绑定customText.text

// CustomText.qml
Item 
{
    property alias text: t1.text    // set a property alias

    TextField
    {
        id: t1
        placeholderText: qsTr("Enter name")
    }
}

// Main.qml
Window 
{
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    CustomText { id: customText; width: 200; height: 200 }   // provide an id for reference    

    Rectangle
    {
        id: r1      
        border.color: "black"
        width: 200
        height: 200
        x: 200
        y: 200
        Text 
        {
            text: customText.text      // bind the text property
        }
    }
}

别名t1,已绑定customText.t1.text

// CustomText.qml
Item 
{
    property alias t1: t1      // set a property alias

    TextField
    {
        id: t1
        placeholderText: qsTr("Enter name")
    }
}

// Main.qml
Window 
{
    visible: true
    width: 640
    height: 480
    title: qsTr("Hello World")

    CustomText { id: customText; width: 200; height: 200 }    // provide an id for reference    

    Rectangle
    {
        id: r1      
        border.color: "black"
        width: 200
        height: 200
        x: 200
        y: 200
        Text 
        {
            text: customText.t1.text    // bind the property
        }
    }
}

如果您只需要使用TextField中的文本,而没有其他选择,我建议您使用第一种方法,因为您仍然将t1的其余部分封装起来(有人可能会说一个“ 私有”变量)。

通常,除非必须在文件外部修改 entire t1对象,否则从不使用第二种方法。 (可能会有一些例外,但是这种模式倾向于暗示设计模式中的缺陷,需要重构。)坚持第一种方法。如果您发现自己不得不引用/修改TextField的其他属性(placeholderTextfont等),则还应该使用别名并公开这些属性。