2013-02-22 8 views
8

Sto provando a testare la classe. Sembra che potrebbe funzionare bene per quello che voglio, se posso sottoclassi. La documentazione here fornisce anche alcune istruzioni rudimentali su cosa fare per la creazione di sottoclassi. Tale documentazione indica anche che questa classe deriva da QObject.Impossibile chiamare lo slot o Q_INVOKABLE da QML nella sottoclasse di QQmlPropertyMap

Per quello che vale, sto usando QtCreator 2.6.1 su Qt 5.0.0 con QtQuick 2.0.

mio 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(); 
     } 
    } 
} 

mio 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(); 
} 

mio 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 

Quando eseguo, ottengo una finestra che dice "valore ", come mi aspetterei. Ma quando si fa clic sulla finestra, ho un output della console dicendo

TypeError: Property 'testFunc' of object TestMap(0xaaa0b8) is not a function 

Ho cercato problemi simili, ma tutti i risultati della ricerca sono circa la gente che ha dimenticato di includere la macro Q_OBJECT. Deve essere qualcosa che sto facendo male nel codice, perché se faccio tutte le modifiche indicate nei commenti del file TestMap (e lasciano main.cpp e main.qml esattamente come sono), ottengo il messaggio qDebug I aspettarsi.

Non sono sicuro se dovrei Q_DECLARE_METATYPE o meno (penso che il costruttore protetto da 2 arg dovrebbe farlo per me), ma non funziona in entrambi i casi.

Per la cronaca, le uniche cose che devo cambiare per farlo funzionare sono:

1) derivano da QObject invece di QQmlPropertyMap.

2) Modificare il costruttore a:

TestMap(QObject* parent = 0): QObject(parent) {} 

E questo è tutto. Dato che funziona quando non cambio nulla sul main.cpp, main.qml o sullo slot stesso, devo concludere che non c'è niente di sbagliato in questi. Qualcuno può dirmi cosa sto facendo di sbagliato?

+2

Per chi sta seguendo questo o che trova in un secondo momento tramite Google, questo è apparentemente un bug in Qt. Vedi la segnalazione di bug che ho inviato qui: https://bugreports.qt-project.org/browse/QTBUG-29836 – kanders84152

risposta