Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to set QML properties from C++

Tags:

c++

qml

qt5.4

I'm trying to do a simple task as changing a property (text: ) of some QML object from C++ yet I'm failing miserably. Any help appreciated.

I'm not getting any errors, the window shows up, just the text property doesn't change as (at least I think) it should. Is even anything I'm NOT doing wrong here?!!

What I was trying is this:

main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include <QQuickView>
#include <QQuickItem>
#include <QQmlEngine>
#include <QQmlComponent>
#include <QString>

int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    QQmlApplicationEngine engine;


    QQmlComponent component(&engine, QUrl::fromLocalFile("main.qml"));
    QObject *object = component.create();

     engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
    QString thisString = "Dr. Perry Cox";

    object->setProperty("text", thisString);  //<--- tried  instead of thisString putting "Dr. ..." but nope.
    delete object;



    return app.exec();
}

main.qml

import QtQuick 2.2
import QtQuick.Window 2.1

Window {
    visible: true
    width: 360
    height: 360

    MouseArea {
        anchors.fill: parent
        onClicked: {
            Qt.quit();
        }
    }

    Text {
        id: whot
        text: ""
        anchors.centerIn: parent
        font.pixelSize: 20
        color: "green"
    }
}
like image 583
hekri Avatar asked Dec 20 '14 22:12

hekri


1 Answers

When you call QObject *object = component.create(); you get access to the root context, which is the Window component and its properties.

To get access to Text properties, you can create property alias like this:

Window {
    property alias text: whot.text
    ...
    Text {
        id: whot
        text: ""
        ...
    }
}

That will give you access to whot's text property from within the Window's context.

There is another slightly more round-about way. Assign objectName property instead of id (or both if you still need id) to whot:

Text {
    id: whot // <--- optional
    objectName: "whot" // <--- required
    text: ""
    ...
 }

Now you can do this in code:

QObject *whot = object->findChild<QObject*>("whot");
if (whot)
    whot->setProperty("text", thisString);

On a side note: I don't think you are supposed to delete the object until after calling app.exec(). Otherwise, it will ... well, be deleted. :)

like image 182
Innocent Bystander Avatar answered Oct 15 '22 13:10

Innocent Bystander