我有一个单独的 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功能。
答案 0 :(得分:2)
要将自定义枚举用作数据类型,其类必须是 注册,枚举也必须用Q_ENUM()声明 将它注册到Qt的元对象系统。
因此,您需要注册课程Card
而不是枚举InGameState
:
qmlRegisterType<Card>("com.memorygame.card", 1, 0, "Card");
枚举类型是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
}
}