Как изменить значение свойства в QML из класса C++

У меня такой код в простом Qt Quick. Я хочу изменить значение свойства элемента qml из моего класса.

мой класс.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

мой класс.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
               }
           }

    }

}

Когда я запускаю приложение и нажимаю на кнопку, приложение вылетает. Что я делаю неправильно?


person Harrix    schedule 18.09.2012    source источник


Ответы (2)


Экземпляр rootObject еще не создан, попробуйте что-то вроде этого:

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

Таким образом, rootObject() будет указывать на правильный экземпляр.

person Luca Carlon    schedule 18.09.2012

m_QMLObject имеет значение NULL. Вам нужно загрузить QML из компонентов ресурсов ПЕРВЫМ, прежде чем пытаться передать rootObject() конструктору вашего объекта «myClass», иначе он всегда будет NULL.

person stackunderflow    schedule 19.09.2012