从C ++调用组件中定义的QML函数

时间:2017-10-08 20:46:43

标签: c++ qt qml

让我们在A.qml中定义一个以下组件:

Item {
    function test() { console.log("this is a test") }
}

在B.qml中,我们执行以下操作:

A {
    function test2() { console.log("this is a second test") }
}

在C ++中,我创建了一个QQuickView并将源设置为B.qml。现在我尝试调用“test”,它失败并显示一条错误消息,指出“测试在B中不存在”。如果我调用“test2”,一切都按预期工作。如果我更改test2以获取以下内容:

A {
    function test2() { test() }
}

成功调用test()。

问题是,当定义A.qml组件时,如何直接从C ++调用test()函数?

注意:我使用的是Qt 5.7.1

1 个答案:

答案 0 :(得分:0)

我试图在Windows 7上使用Qt 5.9.1复制您描述的问题,但我无法重现它。我可以从C ++调用test()和test2()。

因此,如果您需要更多帮助,则需要发布更多代码以帮助重现问题。

我的代码如下......

A.qml

import QtQuick 2.7

Item {
    function test() { console.log("this is a test") }
}

B.qml

import QtQuick 2.7
import QtQuick.Controls 2.0

A {
    id: root
    function test2() { console.log("this is a second test") }

    Button {
        text: "click me"
        onClicked: {
            helper.invokeMethod(root, "test");
            helper.invokeMethod(root, "test2");
        }
    }
}

helper.h

#ifndef HELPER_H
#define HELPER_H

#include <QObject>

class Helper : public QObject
{
    Q_OBJECT
public:
    explicit Helper() { }

    Q_INVOKABLE void invokeMethod(QObject* obj, QString method){
         QMetaObject::invokeMethod(obj, method.toLatin1().constData());
    }

signals:

public slots:
};

#endif // HELPER_H

的main.cpp

#include <QGuiApplication>
#include <QQmlContext>
#include <QQuickView>
#include "helper.h"

int main(int argc, char *argv[])
{
    QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
    QGuiApplication app(argc, argv);

    Helper helper;

    QQuickView *view = new QQuickView;
    view->rootContext()->setContextProperty("helper", &helper);
    view->setSource(QUrl("qrc:/B.qml"));
    view->show();

    return app.exec();
}