2013-02-22 25 views
8

Tôi đang cố gắng lái thử lớp QQmlPropertyMap. Nó có vẻ như nó có thể làm việc tốt cho những gì tôi muốn, nếu tôi có thể phân lớp nó. Tài liệu here thậm chí còn đưa ra một số hướng dẫn sơ bộ về những việc cần làm để phân lớp nó. Tài liệu cho biết cũng cho biết rằng lớp này có nguồn gốc từ QObject.Không thể gọi khe hoặc Q_INVOKABLE từ QML trong phân lớp của QQmlPropertyMap

Đối với những gì đáng giá, tôi đang sử dụng QtCreator 2.6.1 trên Qt 5.0.0 với QtQuick 2.0.

main.qml của tôi:

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 của tôi:

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

My 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 

Khi tôi chạy, tôi nhận được một cửa sổ nói rằng "giá trị ", như tôi mong đợi. Nhưng khi tôi bấm vào cửa sổ, tôi nhận được một giao diện điều khiển đầu ra nói

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

Tôi đã nhìn cho các vấn đề tương tự, nhưng tất cả các kết quả tìm kiếm là về những người mà quên bao gồm các Q_OBJECT vĩ mô. Nó phải là một cái gì đó tôi đang làm sai trong mã, bởi vì nếu tôi thực hiện tất cả những thay đổi được chỉ ra trong các ý kiến ​​của tập tin TestMap (và để main.cpp và main.qml chính xác như là), tôi nhận được thông báo qDebug tôi chờ đợi.

Tôi không chắc chắn liệu mình có phải là Q_DECLARE_METATYPE hay không (tôi nghĩ rằng nhà xây dựng được bảo vệ 2 arg được cho là sẽ làm điều đó cho tôi), nhưng nó không hoạt động theo cách nào cả.

Đối với hồ sơ, điều duy nhất tôi phải thay đổi để làm cho nó làm việc là:

1) Rút ra từ QObject thay vì QQmlPropertyMap.

2) Thay đổi các nhà xây dựng để:

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

Và đó là nó. Kể từ khi nó hoạt động khi tôi không thay đổi bất cứ điều gì về main.cpp, main.qml, hoặc các khe cắm chính nó, tôi phải kết luận nó không có gì sai với những người. Bất cứ ai có thể cho tôi biết những gì tôi đang làm sai?

+2

Đối với bất cứ ai sau này hoặc những người tìm thấy nó sau này thông qua Google, điều này rõ ràng là một lỗi trong Qt. Xem báo cáo lỗi tôi đã gửi tại đây: https://bugreports.qt-project.org/browse/QTBUG-29836 – kanders84152

Trả lời

Các vấn đề liên quan