Я пытаюсь протестировать QQmlPropertyMap
учебный класс. Кажется, что это может хорошо работать для того, что я хочу, если я могу подкласс. Документация Вот даже дает некоторые элементарные инструкции о том, что делать для его подклассов. Указанная документация также указывает, что этот класс является производным от QObject
,
Что бы это ни стоило, я использую 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
сообщение я ожидаю.
Я не уверен, должен ли я Q_DECLARE_METATYPE
или нет (я думаю, что защищенный конструктор с 2 аргументами должен сделать это для меня), но это не работает в любом случае.
Для справки, единственные вещи, которые я должен изменить, чтобы заставить это работать:
1) Получать из QObject
вместо QQmlPropertyMap
,
2) Измените конструктор на:
TestMap(QObject* parent = 0): QObject(parent) {}
И это все. Поскольку он работает, когда я ничего не меняю в main.cpp, main.qml или в самом слоте, я должен заключить, что в этом нет ничего плохого. Может кто-нибудь сказать мне, что я делаю не так?
Это теперь исправлено в Qt 5.1.0 и далее. Подробности смотрите в следующем URL-адресе:
Других решений пока нет …