2013-02-22 20 views
8

私はQQmlPropertyMapクラスをテストしようとしています。私がそれをサブクラス化することができれば、私が望むものに対してはうまくいくかもしれないようです。ドキュメントhereは、サブクラス化のために何をすべきかに関するいくつかの基本的な指示を与えます。また、このドキュメントはQObjectから派生していることを示しています。QQmlPropertyMapのサブクラスでQMLからスロットまたはQ_INVOKABLEを呼び出せません

QtQuick 2.0でQt 5.0.0でQtCreator 2.6.1を使用しています。

マイ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-arg protectedコンストラクタは私のためにやるべきだと思いますが)どちらの方法でも動作しません。レコードの

、私は仕事にそれを得るために変更する必要が唯一のものは、以下のとおりです。

1)QObjectの代わりに、QQmlPropertyMapから派生。

2)にコンストラクタを変更します。

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

そして、それはそれです。 main.cpp、main.qml、またはスロット自体について何も変更していないときに動作するので、私はそれが何も問題ではないと結論づけなければなりません。誰かが私が間違っていることを教えてもらえますか?

+2

が、これは明らかにQtのバグです。私がここに提出したバグレポートを見てください:https://bugreports.qt-project.org/browse/QTBUG-29836 – kanders84152

答えて

1

これは、Qt 5.1.0以降で修正されました。詳細については、以下のコードレビューのURLを参照してください。これを次以降グーグル経由して、それを見つけている人のため

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

関連する問題