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