Próbuję przetestować dysk klasy QQmlPropertyMap
. Wygląda na to, że może dobrze działać na to, co chcę, jeśli mogę ją podklasować. Dokumentacja here podaje nawet podstawowe instrukcje dotyczące tego, co zrobić dla jej podklasy. Wspomniana dokumentacja wskazuje również, że ta klasa wywodzi się z QObject
.Nie można połączyć się z gniazdem lub Q_INVOKABLE z QML w podklasie QQmlPropertyMap
Co jest warte, używam QtCreator 2.6.1 na Qt 5.0.0 z QtQuick 2.0.
Moja 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();
}
}
}
Moja 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();
}
Moja 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
Kiedy biegnę, mam okno mówiąc „wartość ", jak się spodziewałam. Ale gdy klikam na okno, mam wyjścia konsoli mówiąc
TypeError: Property 'testFunc' of object TestMap(0xaaa0b8) is not a function
Szukałem podobnych problemów, ale wszystkie wyniki wyszukiwania są o ludziach, że zapomnisz o podaniu Q_OBJECT
makro. To musi być coś, co robię źle w kodzie, ponieważ jeśli zrobię wszystkie zmiany wskazane w komentarzach pliku TestMap (i pozostawię main.cpp i main.qml dokładnie tak, jak jest), otrzymam komunikat I II oczekiwać.
Nie jestem pewien, czy mam Q_DECLARE_METATYPE
czy nie (myślę, że konstruktor chroniony 2-arg powinien to zrobić dla mnie), ale to nie działa tak czy inaczej.
Dla przypomnienia, tylko rzeczy, muszę zmienić aby zmusić go do pracy to:
1) pochodzą z QObject
zamiast QQmlPropertyMap
.
2) Zmień konstruktora:
TestMap(QObject* parent = 0): QObject(parent) {}
I to wszystko. Ponieważ działa, gdy nic nie zmieniam w main.cpp, main.qml lub samym slocie, muszę stwierdzić, że nie ma w tym nic złego. Czy ktoś może mi powiedzieć, co robię źle?
Dla każdego, kto śledzi tę lub kto znajdzie go później za pośrednictwem Google, to widocznie błąd w Qt. Zobacz raport o błędzie przesłanym tutaj: https://bugreports.qt-project.org/browse/QTBUG-29836 – kanders84152