Я пытаюсь протестировать диск класса QQmlPropertyMap
. Кажется, что это может хорошо работать для того, что я хочу, если я могу подклассифицировать его. Документация here даже дает некоторые рудиментарные инструкции о том, что делать для подклассификации. Указанная документация также указывает, что этот класс происходит от QObject
.Не удается вызвать слот или Q_INVOKABLE из QML в подклассе QQmlPropertyMap
Для чего это стоит, я использую QtCreator 2.6.1 на Qt 5.0.0 с QtQuick 2.0.
Мой 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();
}
}
}
Мой 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();
}
Мой 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
Когда я бегу, я получаю окно: «значение », как и следовало ожидать. Но когда я нажимаю на окно, я получаю консольный вывод о том,
TypeError: Property 'testFunc' of object TestMap(0xaaa0b8) is not a function
Я смотрел на подобные проблемы, но все результаты поиска о людях, которые забыли включить Q_OBJECT
макросъемки. Это должно быть что-то, что я делаю неправильно в коде, потому что, если я сделаю все изменения, указанные в комментариях файла TestMap (и оставьте main.cpp и main.qml точно так же, как есть), я получаю сообщение qDebug
I ожидать.
Я не уверен, должен ли я быть Q_DECLARE_METATYPE
или нет (я думаю, что конструктор, защищенный 2-arg, должен сделать это для меня), но он не работает в любом случае.
Для записи, единственное, что я должен изменить, чтобы заставить его работать, являются:
1) Выведите из QObject
вместо QQmlPropertyMap
.
2) Измените конструктор:
TestMap(QObject* parent = 0): QObject(parent) {}
И это все. Поскольку он работает, когда я ничего не меняю о main.cpp, main.qml или самом слоте, я должен заключить, что в этом нет ничего плохого. Может ли кто-нибудь сказать мне, что я делаю неправильно?
Для тех, кто следит за этим или кто находит его позже с помощью Google, это, по-видимому, ошибка в Qt. См. Отчет об ошибке, представленный здесь: https://bugreports.qt-project.org/browse/QTBUG-29836 – kanders84152