通过消息信号从 QML WorkerScript.sendMessage 调用传递数据

Posted

技术标签:

【中文标题】通过消息信号从 QML WorkerScript.sendMessage 调用传递数据【英文标题】:Pass data from QML WorkerScript.sendMessage call through message signal 【发布时间】:2019-02-06 16:24:01 【问题描述】:

我想动态创建一个 QML WorkerScript 对象,并在我的 javascript 代码中读取其函数的输出。这是我在 QML 文件中尝试的内容:

import QtQuick 2.0

Rectangle 
    id: root
    width: 200
    height: 300

    Component.onCompleted: 
        var worker = Qt.createQmlObject('import QtQuick 2.0; WorkerScript  source: "dataloader.js"; ', root)
        worker.sendMessage();
        worker.message.connect(function (msg)  console.log(msg); );
    

这里是 dataloader.js 文件的来源:

WorkerScript.onMessage = function(msg) 
    WorkerScript.sendMessage('test');

我希望代码将“test”输出到控制台,但它会输出“QVariant(QQmlV4Handle)”。我在 Qt 站点(http://doc.qt.io/qt-5/qml-workerscript.html 和 http://doc.qt.io/qt-5/qtquick-threading-example.html#workerscript)上的一些示例中看到,有一个 messageObject 属性,但是当我尝试使用 worker.messageObject 访问它时,似乎无法从连接函数访问它。谁能在这里指出我正确的方向?

【问题讨论】:

【参考方案1】:

我不知道为什么它会这样工作,但我通过在 WorkerScript 对象中捕获消息信号并将 messageObject 发送到我添加到对象的新信号来获得我想要的功能。这是一个代码示例(dataloader.js 保持不变):

var worker = Qt.createQmlObject('import QtQuick 2.0; 
    WorkerScript  
        signal loaded(var value); 
        source: "dataloader.js"; 
        onMessage:  loaded(messageObject);  
    ', root)
worker.loaded.connect(function (value)  console.log(value); );
worker.sendMessage();

【讨论】:

以上是关于通过消息信号从 QML WorkerScript.sendMessage 调用传递数据的主要内容,如果未能解决你的问题,请参考以下文章

从Qt Quick WorkerScript调用Python方法

如何从另一个线程的 cpp 代码同步调用 qml 信号处理程序?

将 qml 信号连接到 Qt

Qml 注册类型的构造函数中的发射信号不起作用

如何在QML应用中得到一个Item的所有属性,信号及方法,qmlitem

如何将信号从一个 qml 发送到另一个