How do you access properties of a QML component in C++?
-
Okay so I understand you can connect signals and slots between QML and C++ objects and how to pass stuff generated in C++ to QML but how would I go about calling property of QML object for use in C++. Basically what I am trying to do is take text input from the TextInput component in QML and use it to set the currentPath() of an object which in the QDir class. I am sure I messed up a lot syntax and stuff there but I am pretty new to this.
I was thinking of doing something like
@
QObject *object = view.rootObject();
QObject textIn = object->findChild<QObject>("textIn");
@
and then calling text property like so and using QString to make a string.
@
QString textholdervariable(textIn.text());
@
and then doing the following to set my QDir path
@
QDir dir;
QDir::setCurret(textholderviable);
@
But this doesn't work as I get following errorrequest for member ‘text’ in ‘textIn’, which is of non-class type ‘QObject*’
Anyone know the proper way to go about retrieving properties of QML objects for use in C++?
I would also be okay with being able to set the a variable in QML equal to some variable and then being able to call that in C++.
I would also be okay with being told I am asking a stupid question and what I am talking about is impossible or there is a better way to do such a thing any help would be great.Edit: use @ tags to markup code sections please; Andre
-
Look at:
"Locating child objects in QML":http://doc.qt.nokia.com/4.7-snapshot/qtbinding.html#locating-child-objects -
-
The last post helped quite a bit I am having trouble using it though can't seem to find any examples of people actually using it so not sure how I am supposed to implement that piece of code. In the form it is presented it isn't working for me. Do I need to use Q_PROPERTY macros or anything to make it work? Not really sure if what I need to make it work.
-
@QObject *object = view.rootObject();
QObject textIn = object->findChild<QObject>(“textIn”);
textIn->setProperty("text","sampleText"); @See if this works.
-
[quote author="Nazgul" date="1308039647"]i have a similar problem. i managed to set a value from c++ in my qml file. the value is the x position of a qml rectangle, but when i change the value in c++ the rectangle isnt moved. What am i doing wrong?[/quote]
How should we know, if you are not showing us what you are actually doing?
-
I'll check to see if that works but here is something that does work really well
@
QDeclarativeProperty property([name of element], "[name of property]");
@and then to call the property just do
@
property.read()
property.write()
@
and you can even do stuff like property.read().toString etc. this is what I was really looking for I think but thanks for all the help wouldn't have been able to find it without the leads.You still need stuff like
@
QObject object = object->findChild<QObject>("rect");
@
to use this thoughEdit: use @ tags to markup code sections please.
-
c++ code
@QDeclarativeEngine engine;
QDeclarativeComponent component(&engine, url);
QObject *object = component.create();
if (object) {
object->setProperty("currentValue", newVal);
delete object;
object = NULL;
}@and my qml file:
@Item {
id: line
objectName: "line"
property real currentValue: 100
property real minimum: 0
property real maximum: 200
property int xMax: line.width - rect.width - 4
onCurrentValueChanged: { rect.x = 2 + (currentValue - minimum) * line.xMax / (maximum - minimum) }
signal valueChanged(real val)
width: 400
height: 20
Rectangle {
id: rect
x: 0; y: 0
width: 100; height: 20
color: "red"
MouseArea {
anchors.fill: parent
drag.axis: Drag.XAxis
drag.target: rect
drag.minimumX: 0
drag.maximumX: line.width - rect.width
onPositionChanged: {
line.currentValue = (maximum - minimum) * (rect.x-2) / line.xMax + minimum
line.valueChanged(line.currentValue)
}
}
}
}
@thanks in advance
-
What is the delete statement doing on line 6 of your code? What do you expect to happen if you first set a property, and then immediately delete the object?
What you are doing here, is creating an object, setting a property on it, and then immediately disposing of it again. That seems like a rather useless thing to do. Instead, you should try to find the object you wish to manipulate, and then modify its properties. Or, perhaps better from a QML/declarative way of thinking kind-of-perspective, you should create a QObject derived object, give it properties for the position, insert it into your QML environment, and bind to these properties.
-
@QObject* obj = mDeclarativeView->rootObject();
if (obj) {
obj->setProperty("currentValue", newVal);
}@ok, i wasnt sure about a memory leak because the method was create.
i changed my code to the above and made sure obj != null. obj is a qml object with name = "line"
thats fine so far but still the setProperty has no effect.