Qml 从textfield blackberry将文本保存到标签

Qml 从textfield blackberry将文本保存到标签,qml,blackberry-cascades,Qml,Blackberry Cascades,我想在标签上显示最近输入的文本。以下是qml的代码: Container { horizontalAlignment: HorizontalAlignment.Center verticalAlignment: VerticalAlignment.Top topPadding: 100 leftPaddi

我想在标签上显示最近输入的文本。以下是qml的代码:

 Container {
                        horizontalAlignment: HorizontalAlignment.Center
                        verticalAlignment: VerticalAlignment.Top
                        topPadding: 100
                        leftPadding: 50
                        rightPadding: leftPadding

                        /*TextArea {
                            id: taComment
                            preferredHeight: 270
                            editable: quoteBubble.editMode
                            enabled: enableSave
                            input.flags: TextInputFlag.SpellCheckOff
                        }*/
                           Label {
                               verticalAlignment: VerticalAlignment.Top
                               horizontalAlignment: HorizontalAlignment.Center
                               text: cppObj.desc
                           }
                    } 

                    Container {
                        horizontalAlignment: HorizontalAlignment.Center
                        verticalAlignment: VerticalAlignment.Bottom
                        leftPadding: 50
                        rightPadding: leftPadding
                        bottomPadding: 40

                        TextField {
                            id: tfComment
                            hintText: qsTr("add comment")
                            inputMode: TextFieldInputMode.Text
                            input {
                                submitKey: SubmitKey.Submit
                                onSubmitted: {
                                    cppObj.onCommentSubmitClicked(tfComment.text, "");
                                }
                            }
                        }
                    }
                }

因此,当用户从第一个文本字段输入短语时,我希望该短语显示在它下面的标签中。更像是短信。我该怎么做?在将输入的文本从textfield显示到label后,我想保存标签的文本,因此当我输入新注释时,它将保存到其他标签上。首先,您必须在QML中的相关位置设置ObjectName

...
Label {
    objectName: "label"
    ...
}
...
TextField {
    objectName: "textField"
    ...
}
当然,我并不是说这些都是好名字

一旦完成,从C++中使用QML的地方,即:

QmlDocument *qml = QmlDocument::create("asset///qml/YourQml.qml");
Container *container = qml->createRootObject<bb::cascades::Container>();
QmlDocument*qml=QmlDocument::create(“资产///qml/YourQml.qml”);
Container*Container=qml->createRootObject();
然后,您可以找到根对象的子对象(这里只是假定的容器)并按名称操作它们

TextField *textField = container->findChild<TextField*>("textField");
Label *label = container->findChild<Label*>("label");
...
label->setText(textField->text()); //take the text from textField and display in label
TextField*TextField=container->findChild(“TextField”);
标签*标签=容器->findChild(“标签”);
...
标签->设置文本(文本字段->文本())//从文本字段中提取文本并显示在标签中
给标签一个id(例如
id:myLabel
),然后在
提交的
插槽中,将
文本字段的文本指定给该标签,如下所示:

onSubmit :{
    myLabel.text = tfComment.text
}

将id添加到标签,如下所示

 Label {
    id: label
    ....
 }
然后在提交处理程序的TextField上,您可以从TextField获取文本并将其设置为label,如下所示

 onSubmitted: {
    label.text = tfComment.text;
 }

这一切都与Qt信号/插槽和机制属性有关。您的项目,
TextField
Label
具有属性。它们共享的一个特定属性是
text
(注意名称是相同的,但真正重要的是类型-两个名称不同的属性也可以绑定)。可以将属性绑定到另一个属性:

Label {
    text: myTextField.text
}
TextField {
    id: myTextField
}
现在,每当
文本字段
的文本发生更改时,
标签
的文本就会相应地更新。请注意,
TextField
text
属性仅在其失去焦点或提交时更新

这是做你需要的事情的简单方法。有一种更通用的方法。Qt的属性系统基于信号/插槽机制。信号是
QObject
可以发送的东西,用于通知其他
QObject
子对象。插槽是一种特殊的方法,可以连接到信号。然后,如果信号a连接到插槽B,则无论何时发出信号a,都将调用插槽B

TextField
对象有一个子对象,它有一个信号。正如您所猜测的,每当用户提交
TextField
时,就会发出此信号。呃,这是每次你想更改
标签的文本属性的时候!让我们在插槽中执行此操作:

Label {
    id: myLabel
}
TextField {
    id: myTextField
    input {
        onSubmitted: {
            myLabel.text = myTextField.text;
        }
    }
}
这里,
onSubmitted
函数是一个插槽,每当发出
submit
信号时,Qt就会自动调用该插槽。当然,在这个时隙中,你可以做任何你想做的事情:更新属性,在这个对象或其他对象上,调用C++方法,你是自由的。
您将找到一份关于信号、插槽和属性的完整参考资料(在BlackBerry的文档中找不到此参考资料,但它正是BlackBerry所使用的)。

它肯定会起作用,但有更简单的方法可以做到。也许。但必要与否取决于具体情况。我只尝试提供一种方法。例如,如果文本在显示之前需要以某种方式进行按摩,那么通过C++是最好的方法。我当然不认为我应该为此投反对票。嗨,谢谢你的回复,它工作得很完美。编辑我的问题您的意思是,要创建另一个标签并将当前标签的文本传递给新标签,并将新输入的文本显示给当前标签吗?是的。我该怎么做?每次将
tfComment.text
分配给
label.text
提交时,分配
tfComment.text肯定不是最干净的方法(您可以绑定这两个属性,这将自动完成,如果您想知道如何做,请参阅我的答案)。关于你的第二个问题,它简单到
label1.text=label2.text位于右侧插槽中。在这种情况下,当您从文本字段提交数据时,最好创建列表视图并将数据添加到列表模型。因此,创建一个ListView和一个TextField。在TextField submit事件中,将数据添加到ListView的模型,该模型将在ListView上显示数据。