无法在继承自QQmlPropertyMap的QML子类中调用槽或Q_INVOKABLE函数

8
我正在尝试测试驱动QQmlPropertyMap类。如果我可以对它进行子类化,它似乎非常适合我想要的功能。 这里的文档甚至提供了一些初步说明以进行子类化。该文档还指出,此类派生自QObject

值得一提的是,我正在使用QtCreator 2.6.1在Qt 5.0.0和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();
        }
    }
}

我的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

当我运行时,我得到一个显示“value”的窗口,这是我预期的。但当我点击窗口时,我会在控制台输出:
TypeError: Property 'testFunc' of object TestMap(0xaaa0b8) is not a function

我搜索了类似的问题,但是所有的搜索结果都是关于忘记包含 Q_OBJECT 宏定义的人。这说明问题可能是我在代码中做错了什么,因为如果按照 TestMap 文件中的注释所示做出所有更改(并且完全保留 main.cpp 和 main.qml),我会得到我期望的 qDebug 信息。

我不确定是否应该使用 Q_DECLARE_METATYPE(我认为两个参数的受保护构造函数应该已经替我完成了这个工作),但无论哪种方式都不起作用。

记录一下,我必须更改的唯一内容是:

1)从 QQmlPropertyMap 派生为 QObject

2)将构造函数更改为:

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

就是这样。既然在不更改main.cpp、main.qml或插槽本身的任何内容时它能工作,我必须得出结论:这些都没有问题。有谁能告诉我我做错了什么吗?


2
对于那些正在关注此问题或者通过谷歌后来发现此问题的人,请注意,这显然是Qt中的一个错误。请参见我在此提交的错误报告:https://bugreports.qt-project.org/browse/QTBUG-29836 - kanders84152
1个回答

0

看起来这个 bug 在后续版本中又出现了:https://bugreports.qt.io/browse/QTBUG-29836 - Herr von Wurst
它在5.15版本中仍然存在问题。 - jwernerny

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接