让我们在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
答案 0 :(得分:0)
我试图在Windows 7上使用Qt 5.9.1复制您描述的问题,但我无法重现它。我可以从C ++调用test()和test2()。
因此,如果您需要更多帮助,则需要发布更多代码以帮助重现问题。
我的代码如下......
import QtQuick 2.7
Item {
function test() { console.log("this is a test") }
}
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");
}
}
}
#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
#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();
}