gpt4 book ai didi

qt - 如何从 QML 访问在 C++ 类中声明的 Q_ENUM?

转载 作者:行者123 更新时间:2023-12-05 00:44:25 26 4
gpt4 key购买 nike

我在 MyClass 中声明了一个 Q_ENUM,如下所示:

class MyClass {
public:
enum Enum_Test {
eTestA,
eTestB
}
Q_ENUM(Enum_Test)

Q_OBJECT
Q_PROPERTY(MyClass::Enum_Test enumTest READ GetEnumTest WRITE SetEnumTest )
}

我在 QML 端注册了 MyClass,如下所示,并且能够访问它。

auto my_class = std::make_shared<MyClass>();
qmlRegisterUncreatableType<MyClass>("MyClass", 1,0, "MyClass","Cannot create type MyClass in QML");
rootContext()->setContextProperty("my_class", my_class.get());

如何从 QML 访问 Q_ENUM Enum_Test

最佳答案

您的类(class)需要进行两次调整。

  1. 正如JarMan所指出的,它需要一个metaObject,可以通过QObject派生并添加Q_OBJECT来获得:

    class MyClass : public QObject
    {
    Q_OBJECT
    ...
    }

    实际上,也可以使用Q_GADGET,但您似乎已经倾向于Q_OBJECT。但是,按照要求,我们开始:

    class MyClass
    {
    Q_GADGET

    public:
    enum Enum_Test {
    ETestA,
    ETestB
    }
    Q_ENUM(Enum_Test)
    };

    请记住,Q_GADGET cannot have signals ,所以我省略了该属性,仅将此类作为“枚举占位符”。

  2. 枚举值名称需要大写:

    enum Enum_Test {
    ETestA,
    ETestB
    }
    Q_ENUM(Enum_Test)

那么你可以在QML中使用它:

     QtObject {
property int myEnumVal: MyClass.ETestA
}

请注意,由于与 JavaScript 混合,对枚举的支持有些有限。这些值将被转换为整数。此外,当在 JavaScript 开关语句中使用时,QtCreator 不会警告拼写错误(假设版本 4.14)

关于qt - 如何从 QML 访问在 C++ 类中声明的 Q_ENUM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66855134/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com