You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将QML中的回调函数传递到C++层调用?

实现方案

方案1:使用Qt原生QJSValue接收(推荐,无需改动你预期的QML调用写法)

Qt的QJSValue类型原生支持接收QML侧传入的JavaScript函数,实现逻辑如下:

  1. C++侧头文件定义:
#include <QObject>
#include <QJSValue>

class MyCPPObject : public QObject
{
    Q_OBJECT
public:
    explicit MyCPPObject(QObject *parent = nullptr);

    // 暴露给QML调用的方法
    Q_INVOKABLE void setCallback(QJSValue cb);

    // 你业务逻辑中触发回调的入口
    void emitResult(const QVariant& result);

private:
    QJSValue m_callback;
    // 如果你要存std::function也可以,声明为std::function<void(QVariant)> m_cb;
};
  1. C++侧实现:
#include "MyCPPObject.h"

MyCPPObject::MyCPPObject(QObject *parent) : QObject(parent)
{}

void MyCPPObject::setCallback(QJSValue cb)
{
    // 校验传入的是否为可调用函数
    if (!cb.isCallable()) return;
    m_callback = cb;

    // 如果你要转成std::function存储,替换上面的代码为:
    // m_cb = [cb](QVariant res) mutable {
    //     QJSValueList args;
    //     args << QJSValue(res);
    //     cb.call(args);
    // };
}

void MyCPPObject::emitResult(const QVariant& result)
{
    if (!m_callback.isCallable()) return;
    // 构造参数调用QML侧传入的函数
    QJSValueList args;
    args << QJSValue(result);
    m_callback.call(args);
}
  1. QML侧调用和你期望的写法完全一致:
// qml
myCPPObject.setCallback(function(result) { 
    console.log("Got result", result) 
})

方案2:信号槽绑定(Qt原生推荐写法,无需额外实现setCallback)

如果可以接受调整QML侧写法,用Qt标准的信号槽机制实现更稳定:

  1. C++侧只需要定义一个信号即可,无需实现setCallback:
class MyCPPObject : public QObject
{
    Q_OBJECT
signals:
    void resultReady(QVariant result);
};
  1. 你业务逻辑中需要触发回调的位置直接调用emit resultReady(你的返回值);即可
  2. QML侧直接绑定信号:
myCPPObject.onResultReady: function(result) {
    console.log("Got result", result)
}

内容的提问来源于stack exchange,提问作者Ben

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 19:18:03