无法从QQmlPropertyMap的子类中的QML调用slot或Q_INVOKABLE

kan*_*152 8 c++ qt qml qt5 qtcore

我正试着试驾这QQmlPropertyMap门课.如果我可以继承它,它似乎可能适用于我想要的东西.这里的文档甚至提供了关于如何对其进行子类化的一些基本指令.所述文档还表明该类派生自QObject.

对于它的价值,我在Qt 5.0.0上使用QtCreator 2.6.1和QtQuick 2.0.

我的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();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我的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();
}
Run Code Online (Sandbox Code Playgroud)

我的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
Run Code Online (Sandbox Code Playgroud)

当我跑步时,我得到一个窗口,上面写着"价值",正如我所料.但当我点击窗口时,我得到一个控制台输出说

TypeError: Property 'testFunc' of object TestMap(0xaaa0b8) is not a function
Run Code Online (Sandbox Code Playgroud)

我已经找到了类似的问题,但所有搜索结果都是关于忘记包含Q_OBJECT宏的人.它必须是我在代码中做错的东西,因为如果我在TestMap文件的注释中指出了所有的更改(并且完全保留main.cpp和main.qml),我得到了qDebug我期望的消息.

我不确定我是否应该Q_DECLARE_METATYPE(我认为2-arg protected构造函数应该为我做),但它无论如何都不起作用.

为了记录,我必须改变以使其工作的唯一事情是:

1)来自QObject而不是QQmlPropertyMap.

2)将构造函数更改为:

TestMap(QObject* parent = 0): QObject(parent) {}
Run Code Online (Sandbox Code Playgroud)

就是这样.因为当我不改变main.cpp,main.qml或插槽本身的任何内容时它起作用,我必须得出结论,这些并没有错.谁能告诉我我做错了什么?

lpa*_*app 0

该问题现已在 Qt 5.1.0 及更高版本中修复。有关详细信息,请参阅以下代码审查网址:

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