2013-02-22 65 views
8

के उप-वर्ग में QML से स्लॉट या Q_INVOKABLE को कॉल नहीं कर सकता है, मैं QQmlPropertyMap कक्षा ड्राइव का परीक्षण करने का प्रयास कर रहा हूं। ऐसा लगता है कि मैं जो चाहूं उसके लिए अच्छा काम कर सकता हूं, अगर मैं इसे उपclass कर सकता हूं। प्रलेखन here यहां कुछ प्राथमिक निर्देश भी देता है कि इसे सबक्लासिंग के लिए क्या करना है। कहा गया दस्तावेज यह भी इंगित करता है कि यह वर्ग QObject से निकला है।QQmlPropertyMap

इसके लायक होने के लिए, मैं 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 मैक्रो भूल गया के बारे में कर रहे हैं। यह कुछ ऐसा होना चाहिए जो मैं कोड में गलत कर रहा हूं, क्योंकि अगर मैं टेस्टमैप फ़ाइल की टिप्पणियों में संकेतित सभी परिवर्तन करता हूं (और main.cpp और main.qml को ठीक उसी तरह छोड़ देता हूं), तो मुझे qDebug संदेश I मिलता है I उम्मीद करते हैं।

मुझे यकीन नहीं है कि मुझे Q_DECLARE_METATYPE या नहीं (मुझे लगता है कि 2-Arg संरक्षित कन्स्ट्रक्टर को मेरे लिए ऐसा करना चाहिए), लेकिन यह किसी भी तरह से काम नहीं करता है।

रिकॉर्ड के लिए, केवल बातें मैं यह काम करने के लिए प्राप्त करने के लिए बदलने के लिए कर रहे हैं:

1) QObject बजाय QQmlPropertyMap से निकाले जाते हैं।

2) करने के लिए निर्माता बदलें:

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

और बस हो गया। चूंकि यह काम करता है जब मैं main.cpp, main.qml, या स्लॉट के बारे में कुछ भी नहीं बदलता, मुझे निष्कर्ष निकालना होगा कि यह उन लोगों के साथ कुछ भी गलत नहीं है। क्या कोई मुझे बता सकता है कि मैं क्या गलत कर रहा हूं?

+2

जो कोई भी इस या पीछा कर रहा है जो बाद में गूगल के माध्यम से यह पाता है के लिए, यह जाहिरा तौर पर क्यूटी में एक बग है। मैंने यहां सबमिट की गई बग रिपोर्ट देखें: https://bugreports.qt-project.org/browse/QTBUG-29836 – kanders84152

उत्तर