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

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

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: 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: textinputRectwidth: 100
height: 18color: "#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: memoRectwidth: 100
height: 35color: "#00b87b"
TextEdit{
id: memo
objectName: "memo"wrapMode: TextEdit.Wrap
width:parent.width;
readOnly:true
}
}

}

}

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

3

Решение

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 () будет указывать на правильный экземпляр.

2

Другие решения

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

0

По вопросам рекламы [email protected]