2013-02-22 8 views
8

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

+2

Для тех, кто следит за этим или кто находит его позже с помощью Google, это, по-видимому, ошибка в Qt. См. Отчет об ошибке, представленный здесь: https://bugreports.qt-project.org/browse/QTBUG-29836 – kanders84152

ответ