簡體   English   中英

無法從QQmlPropertyMap的子類中的QML調用slot或Q_INVOKABLE

[英]Can't call slot or Q_INVOKABLE from QML in subclass of QQmlPropertyMap

我正在嘗試測試QQmlPropertyMap類。 如果可以將其子類化,它似乎可以很好地滿足我的需求。 這里的文檔甚至提供了一些基本說明,說明如何對其進行子類化。 所述文檔還指示該類從QObject派生。

對於它的價值,我正在Qt 5.0.0和QtQuick 2.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收到qDebug消息期望。

我不確定是否應該使用Q_DECLARE_METATYPE (我認為應該使用2-arg受保護的構造函數為我做這件事),但這兩種方法均無效。

記錄下來,我要做的唯一更改就是:

1)從QObject而不是QQmlPropertyMap派生。

2)將構造函數更改為:

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

就是這樣。 由於當我不更改main.cpp,main.qml或插槽本身的任何內容時,它都可以工作,因此我必須得出結論,這些都沒錯。 誰能告訴我我在做什么錯?

現在,此問題已在Qt 5.1.0及更高版本中修復。 有關詳細信息,請參見以下codereview URL:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM