How to get the text from the textfield in Qt creator? - qt

I have a QML TextField in Qt creator. I want to get the text from the textfield UI.
How do I do that?

You need to have 'named' your TextFields with ids. If an object has an id, you can use it as a handle to access properties from it. For example, imagine you want to clone the text from one textfield to another:
TextField {
id: textField1
text: "Text"
}
TextField {
id: textField2
text: textField1.text
}
You can find more detail here.

Related

How to call TextField with writeable property as default in qml

i have a custom keyboard in qml and has a textField for it so i can use that value somewhere else. When qml page is initialized in application, textfield needs to be clicked to type inside. What i want is when qml initialized should be able to push buttons without clicking textfield first. Here is what i am using
TextField {
id:inputValueArea
width:200;height:35
anchors.fill : parent
background:
font.pixelSize: 20
placeholderText: ""
color: "#FFFFFF"
echoMode: TextInput.Normal
onAccepted: focus = false
Keys.onEscapePressed: undo()
}
I tried to use activeFocusOnPress and inputMethodComposing but it did not work.
(source: https://doc.qt.io/qt-5/qml-qtquick-controls-textfield.html#activeFocusOnPress-prop)
What can i code for that? Since i have keyboard as a seperated qml, i couldn't use this solution as a solution (Qt QML Focus an Item (TextField) when showing a StackView Page)

Add hint to QML TextField with maximum length?

I have a QML TextField where the user can input a limited amount of characters. Is there a way to add a simple hint like so? It can be inside the input too (as uneditable text, of course), or next to it.
ColumnLayout {
Label {
text: "Short description"
}
TextField {
Layout.fillWidth: true
maximumLength: 30
}
}

Create one custom QML signal for several properties

I have an Item composed of several properties:
Item
{
id: propertiesList
property CustomLabel phone: { text: dataFromServer.phone }
property CustomLabel age: { text: dataFromServer.age}
}
I'd like to trigger a signal when the text of one of the properties is changed:
onTextChanged
{
doSomething(phone/age.text)
}
I could create one signal for each property but I don't find this very clean. Is there a way to create one signal for all properties that would handle the text variable ?
EDIT:
CustomLabel.qml
import QtQuick 2.5
import QtQuick.Controls 1.4
Label
{
signal textChanged(string updatedText)
font.pixelSize: 22
font.italic: true
color: "steelblue"
}
First you need a signal that is triggered when the text in the CustomLabel is changed. Then you can connect the signals to a signal in your Item. Like this
Item
{
id: propertiesList
signal textChanged(string updatedText)
property CustomLabel phone: { text: dataFromServer.phone, onTextChanged: doSomething(updatedText) }
property CustomLabel age: { text: dataFromServer.age, onTextChanged: doSomething(updatedText) }
}
-- UPDATE --
Check this. It says
Property Change Signal Handlers
Signal handlers for property change signal take the syntax form
on<Property>Changed where <Property> is the name of the property, with
the first letter capitalized. For example, although the TextInput type
documentation does not document a textChanged signal, this signal is
implicitly available through the fact that TextInput has a text
property and so it is possible to write an onTextChanged signal
handler to be called whenever this property changes:
So, as Label has also a text property, it has also the textChanged signal. I think that you have a conflict with the two signals (the original that Label has because the text property and the one you create in CustomLabel). Give another name to your textChanged signal in CustomLabel and it should work.

How to display correctly Treeview with QML Qt 5.5

I'm trying to create a correct Treeview with Qml Qt 5.5.
I succeed to have a Treeview with a global root.
But impossible to find how to add child for row item.
For the moment I got something like that :
TreeView {
id:listTree
anchors.fill: parent
anchors.leftMargin: 1
headerVisible: false
backgroundVisible: false
selection: ItemSelectionModel {
model: myModel
}
TableViewColumn {
role: "name"
}
itemDelegate: Item {
Text {
anchors.verticalCenter: parent.verticalCenter
color: styleData.textColor
elide: styleData.elideMode
text: styleData.value
}
}
Component.onCompleted: {
model.append({"name":"Never"})
model.append({"name":"gonna"})
model.append({"name":"give"})
model.append({"name":"you"})
model.append({"name":"up"})
model.append({"name":"Never"})
model.append({"name":"gonna"})
model.append({"name":"let"})
model.append({"name":"you"})
model.append({"name":"dow"})
}
}
And I would like something like that :
How can I do it ?
You can also create a TreeModel class that extends QStandardItemModel and overrides roleNames(), like done here. To add children to nodes in your tree, just use appendRow().
TreeModel::TreeModel(QObject *parent) : QStandardItemModel(parent)
{
QStandardItem *root = new QStandardItem("root");
QStandardItem *child = new QStandardItem("child");
this->appendRow(root);
root->appendRow(child);
}
Your model doesn't have any parent child relationships which is why its displayed like a list.
You'll want your "TreeModel" to be a collection of TreeItems. Each TreeItem will have knowledge of their own children and their parent item.
You can follow a fully implemented Qt example found here http://doc.qt.io/qt-5/qtwidgets-itemviews-simpletreemodel-example.html. You'll want to (in C++) make a class for TreeItem, and a separate class for your TreeModel.
That example is working code, you can just copy and paste it and get a working model for your TreeView.
The part you'll be particularly interested in is the implementation of the method setupModelData(). That's where you'll want to parse through your wonderful dataset of 80's lyrics and assign each of them a TreeItem.
Each TreeItem (one for every row of data) should be given knowledge of its parent upon creation (in its constructor). Then as soon as its children are created, call parentTreeItem.appendChild(childTreeItem)
When your model is completed, you can assign it to your qml view in a few ways, registering it with qmlRegisterType is what I prefer (http://doc.qt.io/qt-5/qqmlengine.html#qmlRegisterType)
Once registered, it can be created in qml as though it were a ListView or any other qml object.
NOTE: You'll have this rootItem. This is something that isn't usable by the view, but all your "first indentation" parents are children of the rootItem.
Good luck!
Can you provide a code snippet of what line is causing your about failing to make a shortcut for QAbstractItemModel?

What is button property "tooltip" used for?

I'm writing a test application to try out what QML has to offer. I have created a simple button and tried to create a tooltip on mouse hover event. I found several solutions already how to make that happen (example) and it is not a problem.
In the documentation, however, I have encountered a button property called tooltip. Now I assumed if a built-in component has such a property then creation of tooltip is automated. Apparently that is not the case, since defining tooltip property did not change anything.
The question is what is this property actually used for?
Button {
id: myButton
x: 10
y: 10
text: "Click me"
tooltip: "Some tooltip"
}
Showing of tooltip requires receiving of mouse hover events and this is possible only if your button is not overlapped with some another MouseArea with hoverEnabled property equal to true. Following example shows tooltip fine on OS X and Qt 5.2.1:
import QtQuick 2.0
import QtQuick.Controls 1.1
Rectangle {
width: 360
height: 360
Text {
anchors.centerIn: parent
text: "Hello World"
}
Button {
id: myButton
x: 10
y: 10
text: "Click me"
tooltip: "Some tooltip"
}
}

Resources