如何QObject::连接到QJSValue?

问题描述 投票:0回答:2

如果Qml可以的话

MyComponent.connect(someJsFunction);

我怎样才能在c++上做到这一点??? 如果 JSValue isCallable 且没有解决方法,我需要连接 JSValue。我想知道它是如何制作qml引擎的...

QObject::connect(QObject, signal, QJSValue, evaluateFunctionSlot);
qt qml
2个回答
0
投票

这会起作用。我从这篇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)
    }
}

0
投票

因此,最好的解决方法:

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();
            }
        }
© www.soinside.com 2019 - 2024. All rights reserved.