4

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

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

卡.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)

主文件

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

测试卡.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: 错误:'staticMetaObject' 不是 'Card::InGameState' 的成员 const char *className = T::staticMetaObject 。班级名称(); \

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

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

4

1 回答 1

3

根据文件

要将自定义枚举用作数据类型,必须注册其类,并且还必须使用 Q_ENUM() 声明枚举,以便将其注册到 Qt 的元对象系统。

因此,您需要注册您的课程Card而不是 enum InGameState

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

另外

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

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

import QtQuick 2.0
import com.memorygame.card 1.0

Item {
    property int state: Card.FLIPPED

    Rectangle {
        id: dummy
        width: 10
    }
}
于 2016-12-07T23:23:56.107 回答