Reputation: 547
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
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
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