2
我有一个用C++(逻辑)和QML(UI)编写的应用程序。 在C++部分我有QML对象(种事件系统的)C++ invokeMethod无法访问QML方法
这是C++对象的简化的代码的集合:
class Config : public QObject
{
Q_OBJECT
Q_ENUMS(DataEvent)
public:
enum DataEvent {
DataEventUndefined = 0,
DataEventDateChanged
};
~Config();
Q_INVOKABLE void registerToEvent (DataEvent event, QQuickItem *item)
{
p_dataListeners.insert(event,item);
}
private:
QMap<DataEvent,QQuickItem *> p_dataListeners;
}
在QML对象
我称C++函数,它像一个工作魅力。这是QML代码的一部分:
Item {
id: myQMLObject
function init() {
Config.registerToEvent(Config.DataEventDateChanged,myQMLObject);
}
function receiveEvent(eventType) {
...
}
}
好了,现在我要调用保存的QML对象之一的QML功能:
event = Config::DataEventDateChanged;
QMapIterator<DataEvent,QQuickItem *> i(p_dataListeners);
while (i.hasNext()) {
i.next();
if(event == i.key()) {
QQuickItem *item = i.value();
QMetaObject::invokeMethod(item, "receiveEvent",
QGenericReturnArgument(),
Q_ARG(Config::DataEvent, event));
}
}
,但我得到这个错误:QMetaObject::invokeMethod: No such method MyQMLObject_QMLTYPE_44::receiveEvent(Config::DataEvent)
什么我做错了?
好的,谢谢@Mitch!当我到达我的工作电脑时,我会尝试它。 所以你说这是不可能使用任何注册类型,但只能作为函数参数转换为QVariant? – folibis
这可能是可能的;正如我所说,我不确定。 – Mitch
我已经更新了我的答案,并解释了为什么QVariant是必要的。 – Mitch