[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_OBJECTpublic:
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.0Rectangle {
width: 300
height: 300
anchors.fill: parentColumn { 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?
-
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();
}@ -
Pleasure. Happy to hear you are back on track :D