Невозможно вызвать слот или Q_INVOKABLE из QML в подклассе QQmlPropertyMap

Я пытаюсь протестировать 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 или в самом слоте, я должен заключить, что в этом нет ничего плохого. Может кто-нибудь сказать мне, что я делаю не так?

8

Решение

Это теперь исправлено в Qt 5.1.0 и далее. Подробности смотрите в следующем URL-адресе:

https://codereview.qt-project.org/#change,57418

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]