繁体   English   中英

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

[英]Cannot invoke c++ method from qml: "Property of object is not a function"

我现在试图找到几个小时的解决方案,我完全不知道出了什么问题。

我试图将一个字符串从 QML 提交到 C++ 方法,但出现错误:“qrc:/main.qml:16: TypeError: Property 'test' of object [object Object] is not a function”

有谁知道如何解决这个问题?

非常感谢!

Mabe 相关,但我没有找到解决方案

主程序

#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();
 }

数据.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

主文件

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

Window它有一个名为data的属性,因此您不应该使用该名称,因为可以理解数据是指该属性而不是您传递给它的对象。

解决办法是改名:

C++

engine.rootContext()->setContextProperty("helper", myData);

QML:

helper.test("test");

另一方面,如果您要使用setContextProperty() ,则不需要注册类型。

问题可能是您将上下文属性data命名为已经是Item的属性。 将该属性称为其他名称,它应该可以工作。

最好在 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");
        }
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM