2013-02-22 13 views
8

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?

+2

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

Odpowiedz

Powiązane problemy