Sto provando a testare la classe. Sembra che potrebbe funzionare bene per quello che voglio, se posso sottoclassi. La documentazione here fornisce anche alcune istruzioni rudimentali su cosa fare per la creazione di sottoclassi. Tale documentazione indica anche che questa classe deriva da QObject
.Impossibile chiamare lo slot o Q_INVOKABLE da QML nella sottoclasse di QQmlPropertyMap
Per quello che vale, sto usando QtCreator 2.6.1 su Qt 5.0.0 con QtQuick 2.0.
mio main.qml:
import QtQuick 2.0
Rectangle {
width: 360
height: 360
Text {
text: owner.field
anchors.centerIn: parent
}
MouseArea {
anchors.fill: parent
onClicked: {
owner.testFunc();
}
}
}
mio main.cpp:
#include <QtGui/QGuiApplication>
#include "qtquick2applicationviewer.h"
#include "TestMap.h"
#include <QQmlContext>
int main(int argc, char *argv[])
{
TestMap* map = new TestMap();
QGuiApplication app(argc, argv);
QtQuick2ApplicationViewer viewer;
QQmlContext* ctxt = viewer.rootContext();
ctxt->setContextProperty("owner", map);
viewer.setMainQmlFile(QStringLiteral("qml/TestMap/main.qml"));
viewer.showExpanded();
return app.exec();
}
mio TestMap.h
#ifndef TESTMAP_H
#define TESTMAP_H
#include <QObject>
#include <QQmlPropertyMap>
#include <QDebug>
class TestMap: public QQmlPropertyMap // QObject
{
Q_OBJECT
public:
TestMap(QObject* parent = 0): QQmlPropertyMap(this, parent) // QObject(parent)
{
insert("field", "value"); // Comment this out
}
TestMap(const TestMap& value) { }
virtual ~TestMap() {}
public slots:
void testFunc()
{
qDebug() << "Success!";
}
};
Q_DECLARE_METATYPE(TestMap)
#endif
Quando eseguo, ottengo una finestra che dice "valore ", come mi aspetterei. Ma quando si fa clic sulla finestra, ho un output della console dicendo
TypeError: Property 'testFunc' of object TestMap(0xaaa0b8) is not a function
Ho cercato problemi simili, ma tutti i risultati della ricerca sono circa la gente che ha dimenticato di includere la macro Q_OBJECT
. Deve essere qualcosa che sto facendo male nel codice, perché se faccio tutte le modifiche indicate nei commenti del file TestMap (e lasciano main.cpp e main.qml esattamente come sono), ottengo il messaggio qDebug
I aspettarsi.
Non sono sicuro se dovrei Q_DECLARE_METATYPE
o meno (penso che il costruttore protetto da 2 arg dovrebbe farlo per me), ma non funziona in entrambi i casi.
Per la cronaca, le uniche cose che devo cambiare per farlo funzionare sono:
1) derivano da QObject
invece di QQmlPropertyMap
.
2) Modificare il costruttore a:
TestMap(QObject* parent = 0): QObject(parent) {}
E questo è tutto. Dato che funziona quando non cambio nulla sul main.cpp, main.qml o sullo slot stesso, devo concludere che non c'è niente di sbagliato in questi. Qualcuno può dirmi cosa sto facendo di sbagliato?
Per chi sta seguendo questo o che trova in un secondo momento tramite Google, questo è apparentemente un bug in Qt. Vedi la segnalazione di bug che ho inviato qui: https://bugreports.qt-project.org/browse/QTBUG-29836 – kanders84152