无法从qml调用c ++方法:“对象的属性不是函数”

时间:2018-07-25 17:15:06

标签: c++ qt qml qt5

我现在正试图寻找解决方法达数小时之久,但我绝对不知道哪里出了问题。

我试图将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");
        }
    }
}

3 个答案:

答案 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");
        }
    }
}