如果Qml可以的话
MyComponent.connect(someJsFunction);
我怎样才能在c++上做到这一点??? 如果 JSValue isCallable 且没有解决方法,我需要连接 JSValue。我想知道它是如何制作qml引擎的...
QObject::connect(QObject, signal, QJSValue, evaluateFunctionSlot);
这会起作用。我从这篇SO post中得到了解决方案。也就是说,我不知道它是否符合 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.log("QML" , value)
}
}
因此,最好的解决方法:
c++
//connections
QJSValueIterator it(_def_cbks);
if(it.hasNext()){
auto t_connections = QQmlComponent(JS);
t_connections.setData("import QtQuick; Connections { function connect(wnd, cbk, fn){ wnd[cbk].connect(fn); } }", QUrl());
if(t_connections.status() == QQmlComponent::Ready){
QQuickItem *connections = static_cast<QQuickItem *>(t_connections.create());
while(it.hasNext()){
it.next();
QMetaObject::invokeMethod(connections, "connect", Q_ARG(QVariant, QVariant::fromValue(t_window)), Q_ARG(QVariant, it.name()), Q_ARG(QVariant, it.value().toVariant()));
}
connections->deleteLater();
}
}