QML组件枚举类属性

时间:2016-12-07 22:00:23

标签: qt c++11 qml enum-class

我有一个单独的 qml 文件中的委托组件,其中我想要一个属性,这是一个枚举类类型来自c ++ QObject的 。 这可能吗?

这是最小(非)工作示例:

card.h

#include <QObject>

class Card : public QObject
{
    Q_OBJECT
public:
    explicit Card(QObject *parent = 0);

    enum class InGameState {
        IDLE,
        FLIPPED,
        HIDDEN
    };
    Q_ENUM(InGameState)

private:
    InGameState mState;
};
Q_DECLARE_METATYPE(Card::InGameState)

的main.cpp

#include <QGuiApplication>
#include <QQmlApplicationEngine>
#include "card.h"
int main(int argc, char *argv[])
{
    QGuiApplication app(argc, argv);

    qmlRegisterType<Card::InGameState>("com.memorygame.ingamestate", 1, 0, "InGameState");
    QQmlApplicationEngine engine;
    engine.load(QUrl(QStringLiteral("qrc:/main.qml")));

    return app.exec();
}

testcard.qml

import QtQuick 2.0
import com.memorygame.ingamestate 1.0

Item {
    property InGameState state

    Rectangle {
        id: dummy
        width: 10
    }
}

我得到编译器错误:

  

D:\ Programs \ Qt \ Qt5.7.0 \ 5.7 \ mingw53_32 \ include \ QtQml \ qqml.h:89:错误:   &#39; staticMetaObject&#39;不是&#39; Card :: InGameState&#39;的成员。        const char * className = T :: staticMetaObject.className(); \

枚举类不是QObject,这就是我收到此错误的原因,对吧?但是,Q_ENUM宏不应该在MetaSystem中使用吗?

你能帮我解决这个问题吗?我可以删除枚举类,并将其更改为枚举,并在qml中使用int属性,但我想使用c ++ 11功能。

1 个答案:

答案 0 :(得分:2)

根据documentation

  

要将自定义枚举用作数据类型,其类必须是   注册,枚举也必须用Q_ENUM()声明   将它注册到Qt的元对象系统。

因此,您需要注册课程Card而不是枚举InGameState

qmlRegisterType<Card>("com.memorygame.card", 1, 0, "Card");

Additionally

  

枚举类型是C ++枚举类型的表示。它不是   可以在QML本身中引用枚举类型;相反,   引用枚举值时可以使用int或var类型   QML代码。

例如,在您的情况下,枚举应按如下方式使用:

import QtQuick 2.0
import com.memorygame.card 1.0

Item {
    property int state: Card.FLIPPED

    Rectangle {
        id: dummy
        width: 10
    }
}
相关问题