我现在正试图寻找解决方法达数小时之久,但我绝对不知道哪里出了问题。
我试图将QML的字符串提交给C ++方法,但出现错误:“ qrc:/main.qml:16:TypeError:对象[object Object]的属性'test'不是函数” < / p>
有人知道如何解决此问题吗?
非常感谢您!
Mabe related but I do not find a solution
main.cpp
#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "data.h"
#include <QQmlContext>
int main(int argc, char *argv[])
{
QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
QGuiApplication app(argc, argv);
qmlRegisterType<Data>("com.br.classes", 1, 0, "Data");
Data* myData = new Data();
QQmlApplicationEngine engine;
engine.rootContext()->setContextProperty("data", myData);
engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
if (engine.rootObjects().isEmpty())
return -1;
return app.exec();
}
data.h
#ifndef DATA_H
#define DATA_H
#include <QObject>
#include <QDebug>
class Data : public QObject
{
Q_OBJECT
public:
explicit Data(QObject *parent = nullptr);
Q_INVOKABLE void test(QString strg) {qDebug() << "Received string: " << strg;}
};
#endif // DATA_H
main.qml
import QtQuick 2.7
import QtQuick.Window 2.2
import QtQuick.Controls 2.2
import com.br.classes 1.0
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Button {
text: "Press me!"
onClicked: {
data.test("test");
}
}
}
答案 0 :(得分:1)
问题可能是您将上下文属性data
命名为already a property of Item
.,将其命名为其他属性,它应该可以工作。
答案 1 :(得分:1)
Window,它具有一个名为data的属性,因此您不应使用该名称,因为可以理解,数据是指该属性,而不是您要传递给该属性的对象。
解决方案是更改名称:
C ++
engine.rootContext()->setContextProperty("helper", myData);
QML:
helper.test("test");
另一方面,如果要使用setContextProperty()
,则不必注册类型。
答案 2 :(得分:0)
最好用QML代码创建该类的对象,然后使用其功能。
您的main.qml
import QtQuick 2.7
import QtQuick.Window 2.2
import QtQuick.Controls 2.2
import com.br.classes 1.0
Window {
visible: true
width: 640
height: 480
title: qsTr("Hello World")
Data { id: data }
Button {
text: "Press me!"
onClicked: {
data.test("test");
}
}
}