【问题标题】:QML component enum class propertyQML 组件枚举类属性
【发布时间】:2017-04-23 00:40:19
【问题描述】:

我在一个单独的 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:错误: “staticMetaObject”不是“Card::InGameState”的成员 const char *className = T::staticMetaObject.className(); \

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

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

【问题讨论】:

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


    【解决方案1】:

    根据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
        }
    }
    

    【讨论】:

    • 嘿塔罗德!谢谢您的帮助! (实际上注册 Card 类是在我的真实项目中完成的,但很抱歉没有在原始帖子中提及它)真正的大帮助是指出 QML 永远不会有枚举类的自定义属性类型,这是我原来的(错误)的想法。我设法在信号槽中使用 int 和 var,分别在接收端使用 int 和 QVariant 参数类型。
    • @speter 太棒了!谢谢你。快乐编码:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-15
    • 2011-02-16
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多