我正在尝试将QML信号连接到具有以下参数类型的Qt插槽:
QML侧:
signal Sig(var info)
在Qt侧:
QObject::connect(topLevel, SIGNAL(Sig(QVariantMap)), &mObj, SLOT(mSlot(QVariantMap)));
这给了我以下信息:
QObject::connect: No such signal QQuickWindowQmlImpl_QML_24::Sig(QVariantMap) in ...
因此,我假设类型var
和QVariantMap
不匹配。根据本文档,QVariantMap
类型被转换为JavaScript对象。但我不确定它是否也会反过来。
我实现了一种相反类型的连接(使用QVariantMap的Qt信号,使用"Connections"元素的QML处理程序(,效果很好。我能够将信号的参数作为JS对象获取。
顺便说一句,我在代码中也尝试了与string
参数类型相同的连接,所以我不认为我的代码中有另一个无关的错误。
如何使用信号/插槽机制将JS对象传递到Qt(C++(端?我一直没能找到解决办法。实际上,甚至没有一个例子与我的情况(信号和插槽参数类型(相匹配。这让我觉得我在犯某种设计错误。
参数是C++侧的QVariant
s,因此需要进行
QObject::connect(topLevel, SIGNAL(Sig(QVariant)), &mObj, SLOT(mSlot(QVariant)));
请注意,您还需要更改mSlot
参数类型,因为QVariant
不能隐式转换为QVariantMap
。要在插槽中获取映射,请使用QVariant::toMap()
方法,如果它确实是映射(如果不是,则此方法返回空映射,并且需要进行一些调试(。
它的工作方式正好相反,因为QVariantMap
可以隐式转换为QVariant
。