Это сработает. Я получил решение из этого поста SO . Тем не менее, я не знаю, соответствует ли это способу Qt сделать это. В их примере вызова метода QML используется QMetaObject::invokeMethod().
main.cpp
#include <QGuiApplication>
#include <QQuickItem>
#include <QQuickView>
class MyClass : public QObject
{
Q_OBJECT
signals:
void cppSignal(const QString &msg);
};
int main(int argc, char *argv[])
{
QGuiApplication app(argc, argv);
QQuickView view(QUrl(u"qrc:/75069400/main.qml"_qs));
view.show();
QObject *item = view.rootObject();
MyClass myClass;
QObject::connect(&myClass, SIGNAL(cppSignal(QString)),
item, SLOT(callFromCpp(QString)));
emit myClass.cppSignal("this is a test");
return app.exec();
}
#include "main.moc"
main.qml
import QtQuick
Rectangle {
width: 320
height: 240
function callFromCpp(value : string) {
console.info("QML" , value)
}
}
В результате лучший обходной путь:
qml
function connect(name, fn){
myObject[name].connect(fn[name]);
}
С++
QMetaObject::invokeMethod(MyObject, "connect", Q_ARG(QVariant, "anySlotName"), Q_ARG(QVariant, QVariant::fromValue(data)));
Большое спасибо за ответ, но это не QJSValue. Мне нужно подключить сигнал QObject к слоту QJSValue, как QJSValue.call(). Я знаю, как сделать обходной путь, но это не интересно.