У меня есть так код в простом 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
}
}
}
}
Когда я запускаю приложение и нажимаю на кнопку, приложение вылетает. Что я делаю неправильно?
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 () будет указывать на правильный экземпляр.
m_QMLObject имеет значение NULL. Прежде чем пытаться передать rootObject () в конструктор вашего объекта «myClass», вам необходимо загрузить QML из компонентов ресурса, или он всегда будет равен NULL.