gpt4 book ai didi

c++ - 如何从 C++ 类更改 QML 中的属性值

转载 作者:太空狗 更新时间:2023-10-29 21:26:07 30 4
gpt4 key购买 nike

我在简单的 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);
}

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

主.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
}
}

}

}

当我运行应用程序并单击按钮时,应用程序崩溃了。我做错了什么?

最佳答案

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() 将指向正确的实例。

关于c++ - 如何从 C++ 类更改 QML 中的属性值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12481587/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com