如何将QML中的回调函数传递到C++层调用?
实现方案
方案1:使用Qt原生QJSValue接收(推荐,无需改动你预期的QML调用写法)
Qt的QJSValue类型原生支持接收QML侧传入的JavaScript函数,实现逻辑如下:
- 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; };
- 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); }
- QML侧调用和你期望的写法完全一致:
// qml myCPPObject.setCallback(function(result) { console.log("Got result", result) })
方案2:信号槽绑定(Qt原生推荐写法,无需额外实现setCallback)
如果可以接受调整QML侧写法,用Qt标准的信号槽机制实现更稳定:
- C++侧只需要定义一个信号即可,无需实现setCallback:
class MyCPPObject : public QObject { Q_OBJECT signals: void resultReady(QVariant result); };
- 你业务逻辑中需要触发回调的位置直接调用
emit resultReady(你的返回值);即可 - QML侧直接绑定信号:
myCPPObject.onResultReady: function(result) { console.log("Got result", result) }
内容的提问来源于stack exchange,提问作者Ben
相关产品推荐
相关产品推荐

