Сохранение текста в метку из текстового поля blackberry

Я хочу отобразить недавно введенный текст на метке. Вот код для 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, "");
                                }
                            }
                        }
                    }
                }

Поэтому, когда пользователь вводит фразу из первого текстового поля, я хочу, чтобы эта фраза отображалась в метке под ней. Больше похоже на текстовое сообщение. Как я могу это сделать? И после отображения введенного текста из текстового поля в метку я хочу сохранить текст метки, поэтому, когда я ввожу новый комментарий, он будет сохранен на другой метке.


person kev    schedule 22.07.2013    source источник


Ответы (4)


Добавьте идентификатор в метку, как показано ниже.

 Label {
    id: label
    ....
 }

Затем в TextField в обработчике отправки вы можете получить текст из textField и установить для него метку, как показано ниже.

 onSubmitted: {
    label.text = tfComment.text;
 }
person Kunal    schedule 22.07.2013
comment
Привет, спасибо за ваш ответ, и он работает безупречно. Хотя отредактировал мой вопрос - person kev; 24.07.2013
comment
Вы имеете в виду, что хотите создать другую метку и передать текст текущей метки в новую и отобразить новый введенный текст в текущей? - person Kunal; 24.07.2013
comment
Да, точно. Как я могу это сделать? - person kev; 25.07.2013
comment
Назначение tfComment.text на label.text каждый раз, когда onSubmitted, безусловно, не самый чистый способ (вы можете связать оба свойства, это будет сделано автоматически, см. мой ответ, если вы хотите знать, как это сделать). Что касается вашего второго вопроса, это так же просто, как label1.text = label2.text; в правом слоте. - person Marc Plano-Lesay; 25.07.2013
comment
в этом случае лучше всего создать представление списка и добавить данные в модель списка при отправке данных из текстового поля. Поэтому создайте один ListView и один TextField. В событии отправки TextField добавьте данные в модель ListView, которая будет отображать данные в ListView. - person Kunal; 25.07.2013

Все это связано с сигналами/слотами Qt и механизмом свойств. Ваши элементы TextField и Label имеют свойства. У них есть общее свойство — text (обратите внимание, что имя одинаковое, но что действительно важно, так это тип — два свойства с разными именами также могут быть связаны). Вы можете привязать свойство к другому:

Label {
    text: myTextField.text
}
TextField {
    id: myTextField
}

Теперь всякий раз, когда текст TextField изменяется, текст Label соответственно обновляется. Обратите внимание, что свойство text объекта TextField обновляется только тогда, когда оно теряет фокус или когда оно отправляется.

Это простой способ сделать то, что вам нужно. Есть более универсальный способ. Система свойств Qt основана на механизме сигналов/слотов. Сигнал — это то, что QObject может отправить, чтобы уведомить других QObject дочерних элементов. Слоты — это особый вид методов, которые могут быть связаны с сигналами. Затем, если сигнал A подключен к слоту B, всякий раз, когда будет излучаться сигнал A, будет вызываться слот B.

У объекта TextField есть дочерний элемент input, который имеет submitted. Как вы можете догадаться, этот сигнал испускается всякий раз, когда пользователь отправляет файл TextField. Эх, это каждый раз, когда вы хотите изменить текстовое свойство вашего Label! Сделаем это в слоте:

Label {
    id: myLabel
}
TextField {
    id: myTextField
    input {
        onSubmitted: {
            myLabel.text = myTextField.text;
        }
    }
}

Здесь функция onSubmitted представляет собой слот, который будет автоматически вызываться Qt всякий раз, когда испускается сигнал submit. Конечно, вы можете делать в этом слоте все, что хотите: обновлять свойства этого или других объектов, вызывать метод C++, … вы свободны.

Полный справочник по сигналам и слотам вы найдете здесь, и о свойствах здесь (не удалось найти это в документации BlackBerry, но это именно то, что используется BlackBerry).

person Marc Plano-Lesay    schedule 23.07.2013

Дайте вашей метке идентификатор (например, id : myLabel), затем в слоте onSubmitted назначьте текст TextField этой метке следующим образом:

onSubmit :{
    myLabel.text = tfComment.text
}
person unexplored    schedule 22.07.2013

Сначала вы должны установить имена объектов в соответствующих местах в QML.

...
Label {
    objectName: "label"
    ...
}
...
TextField {
    objectName: "textField"
    ...
}

Конечно, я не утверждаю, что это хорошие имена.

Как только это будет сделано, откуда вы используете QML в С++, т.е.:

QmlDocument *qml = QmlDocument::create("asset///qml/YourQml.qml");
Container *container = qml->createRootObject<bb::cascades::Container>();

Затем вы можете найти дочерние элементы корневого объекта (предполагаемый здесь контейнер) и манипулировать ими по имени.

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
person Konrad Lindenbach    schedule 22.07.2013
comment
Это, безусловно, сработает, но есть гораздо более простые способы сделать это. - person Marc Plano-Lesay; 23.07.2013
comment
Возможно. Но то, что необходимо или нет, является косвенным. Я только попытался обеспечить один подход. Если, например, текст нужно каким-то образом массировать перед его отображением, то лучше всего использовать C++. Я определенно не думаю, что заслуживаю минуса за это - person Konrad Lindenbach; 23.07.2013