2013-02-22 10 views
8

alt sınıfında QML'den Q_INVOKABLE alanı arayamıyorum veya QQmlPropertyMap sınıfını sınamaya çalışıyorum. Eğer alt sınıfını yapabilirsem, istediğim şey için işe yarayabilir gibi görünüyor. here dokümantasyonu, alt sınıflandırma için ne yapılması gerektiği konusunda bile bazı temel talimatlar verir. Söz konusu belgeler ayrıca bu sınıfın QObject'dan geldiğini de belirtir.QQmlPropertyMap

Bunun için QtQuick 2.0 ile Qt 5.0.0 üzerinde QtCreator 2.6.1 kullanıyorum.

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

Benim main.cpp: Ben çalıştırdığınızda

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

Benim 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 

, benim hemen bir pencere söyleyerek "değeri "beklediğim gibi. Pencerenin tıkladığında Ama ben benzer sorunlar için baktım

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

söyleyen bir konsol çıktısını almak, ancak tüm arama sonuçları Q_OBJECT makro eklemeyi unutursam insanlar hakkındadır. Kodda yanlış yaptığım bir şey olmalı, çünkü TestMap dosyasının yorumlarında belirtilen tüm değişiklikleri yaparsam (ve main.cpp ve main.qml'yi olduğu gibi bırakın), qDebug iletisini alıyorum bekliyoruz.

Q_DECLARE_METATYPE ya da (2-arg korumalı yapıcının benim için yapması gerekiyor sanırım) yapmam gerekmediğinden emin değilim, ama her iki şekilde işe yaramıyor. Kayıt için

, işe almak için değiştirmek zorunda tek şey:

1) QObject yerine QQmlPropertyMap türevi.

2) için yapıcı değiştirin:

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

Ve işte bu kadar. Main.cpp, main.qml veya slotun kendisi ile ilgili bir şey değiştirmediğimde işe yaradığı için, bunların yanlış bir şey olmadığı sonucuna varmalıyım. Bana yanlış yaptığımı söyleyen var mı?

+2

, bu görünüşte Qt bir hata olduğunu. Burada gönderdiğim hata raporuna bakın: https://bugreports.qt-project.org/browse/QTBUG-29836 – kanders84152

cevap