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