Harrix
Harrix

Reputation: 547

How to change the value of a property in QML from C++ class

I have so code in simple Qt Quick. I want to change the value of a property of qml element from my class.

myclass.h

#ifndef MYCLASS_H
#define MYCLASS_H
#include <QObject>
#include "qdebug.h"
#include <QtGui/QApplication>
#include <QDebug>
#include <QDeclarativeContext>
#include <QGraphicsObject>
#include <QVariant>

class myClass : public QObject
{
    Q_OBJECT

public:
    myClass(QObject *QMLObject) : m_QMLObject(QMLObject) {}

public slots:
   void cppSlot(int number);

protected:
    QObject *m_QMLObject;

};

#endif // MYCLASS_H

myclass.cpp

#include "myclass.h"

void myClass::cppSlot(int number) {
    qDebug() << "Called the C++ slot with" << number;
    QObject* textinput = m_QMLObject->findChild<QObject*>("textinput");

    QObject* memo = m_QMLObject->findChild<QObject*>("memo");

    QString str;

    str=(textinput->property("text")).toString();

    int a;
    a=str.toInt();
    a++;

    QString str2;
    str2=QString::number(a);

    memo->setProperty("text", str+"+1="+str2);
}

main.cpp

#include <QtGui/QApplication>
#include "qmlapplicationviewer.h"
#include <QUrl>
#include <QDebug>
#include <QDeclarativeContext>
#include <QGraphicsObject>
#include "myclass.h"

Q_DECL_EXPORT int main(int argc, char *argv[])
{
    QScopedPointer<QApplication> app(createApplication(argc, argv));

    QmlApplicationViewer viewer;

    myClass MyClass(viewer.rootObject());


    viewer.rootContext()->setContextProperty("myObject", &MyClass);

    viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
    viewer.setSource(QUrl("qrc:qml/qml/Example/main.qml"));


    viewer.showExpanded();

    return app->exec();
}

main.qml

import QtQuick 1.0

Rectangle {
    width: 300
    height: 300
    anchors.fill: parent


    Column {
        spacing: 5
        anchors.centerIn: parent;

       Rectangle {
           id: button

           width: 100
           height: 30

           color: "#e0b87b"

           Text {
               id: buttonLabel
               text: "Start"
               anchors.centerIn: parent;
           }

           MouseArea {
               anchors.fill: parent
               id: mouseArea

               onClicked: myObject.cppSlot(1);
           }
       }

           Rectangle {
               id: textinputRect 


               width: 100
               height: 18


               color: "#e0b87b"

               TextInput {
                   id: textinput
                   objectName: "textinput"
                   color: "#f51515";
                   selectionColor: "blue"
                   font.pixelSize: 12;
                   width: parent.width-4
                   anchors.centerIn: parent
                   focus: true
                   text:"1"
                   }
           }


           Rectangle {
               id: memoRect 


               width: 100
               height: 35


               color: "#00b87b"

               TextEdit{
                   id: memo
                   objectName: "memo"
                   wrapMode: TextEdit.Wrap
                   width:parent.width;
                   readOnly:true
               }
           }

    }

}

When I run the application and click on the button, the application crashes. What am I doing wrong?

Upvotes: 3

Views: 3098

Answers (2)

stackunderflow
stackunderflow

Reputation: 10662

m_QMLObject is NULL. You need to load the QML from the resource components FIRST before trying to pass the rootObject() to the constructor of your "myClass" object or it will always be NULL.

Upvotes: 0

Luca Carlon
Luca Carlon

Reputation: 9976

The rootObject is not instantiated yet, try something like this:

Q_DECL_EXPORT int main(int argc, char *argv[])
{
    QScopedPointer<QApplication> app(createApplication(argc, argv));
    QmlApplicationViewer viewer;
    viewer.setOrientation(QmlApplicationViewer::ScreenOrientationAuto);
    viewer.setSource(QUrl("qrc:qml/qml/Example/main.qml"));
    myClass MyClass(viewer.rootObject());
    viewer.rootContext()->setContextProperty("myObject", &MyClass);
    viewer.showExpanded();
    return app->exec();
}

This way the rootObject() will point to the correct instance.

Upvotes: 3

Related Questions