将回调作为参数发送到 QJSValue::callAsConstructor()

Posted

技术标签:

【中文标题】将回调作为参数发送到 QJSValue::callAsConstructor()【英文标题】:Send callback as argument to QJSValue::callAsConstructor() 【发布时间】:2019-07-23 19:51:26 【问题描述】:

当尝试使用 QJSEngine 从 C++ 调用 javascript 函数时,其值存储函数的所有参数属性都神秘地丢失了。为什么会发生?有没有办法解决这个错误?如果你试图传递一个没有对象的函数,也会传递未定义的值。

qjsengine-bug

QT += core qml quick quickcontrols2
TARGET = qjsengine-bug
TEMPLATE = app
DEFINES += QT_DEPRECATED_WARNINGS
CONFIG += c++11 console
SOURCES += main.cpp

ma​​in.cpp

#include <QCoreApplication>
#include <QJSValueIterator>
#include <QJSEngine>
#include <QJSValue>
#include <QtGlobal>

#include <iostream>

void myMessageOutput(
    QtMsgType t,
    const QMessageLogContext &c,
    const QString &msg
) 
    Q_UNUSED(t);
    Q_UNUSED(c);
    std::cout << msg.toStdString() << "\n";


int main(int argc, char *argv[]) 
    qInstallMessageHandler(myMessageOutput);
    QCoreApplication app(argc, argv);

    QJSEngine engine;
    engine.installExtensions(QJSEngine::ConsoleExtension);
    QJSValue constructor = engine.evaluate(
        "(function Component(props)console.log(JSON.stringify(props)))"
    );

    QJSValue callBack = engine.evaluate("(function(text)console.log(text))");
    callBack.call("There is no error. Valid JavaScript code...");

    callBack.call("Let's create an object, add a couple of props to it");

    QJSValue object = engine.newObject();
    object.setProperty("First", 1);
    object.setProperty("Second", callBack);
    object.setProperty("Third", "#2");

    QJSValueIterator iter(object);
    while (iter.hasNext()) 
        iter.next();
        callBack.call(
            QString("name: %1, value: %2")
                .arg(iter.name())
                .arg(iter.value().toString())
        );
    

    callBack.call("Correct. Three fields");
    callBack.call("Let's try to pass an object to the constructor parameters");

    constructor.callAsConstructor(object);

    callBack.call("Where did the second property go?");

    return app.exec();

【问题讨论】:

【参考方案1】:

按照定义,JSON 没有任何东西可以表示函数,因此 JSON.stringify 将函数作为属性将导致“缺失”属性(或数组中的函数,或函数)。

【讨论】:

以上是关于将回调作为参数发送到 QJSValue::callAsConstructor()的主要内容,如果未能解决你的问题,请参考以下文章

如何将参数发送到 HTTPService 调用以作为组件重用

将 UIImageView 作为参数发送到 WCF 服务

如何将数组作为参数发送到iOS中的json服务

将订阅响应作为参数发送到方法 Angular/rxJs

如何将 jchararray 作为参数发送到 C 函数

将正确的 JSON 作为参数发送到 RPC