[Solved] How to change the value of a property of QML in 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(&#41;;
    

    }@

    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&#41;;
           }
       }
    
           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?


  • Moderators

    You are getting the root object before source file is set. I'm not sure, but that might be the problem here. Or, quite probably, findChild<>() fails and returns 0, but you don't check if objects are valid before attempting to run some methods on them, and the app bails out (SIGSEGV).

    Debug your app to find the place where it fails... or add more qDebug()s and see which ones don't show up.



  • Thank you so much! This works!

    @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();
    }@


  • Moderators

    Pleasure. Happy to hear you are back on track :D


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.