Qt 对从QML调用的插槽使用来自不同类(或名称空间)的枚举

Qt 对从QML调用的插槽使用来自不同类(或名称空间)的枚举,qt,enums,qml,qt5,Qt,Enums,Qml,Qt5,我有一个类(例如MyEnumClass,Q\u GADGET),我在其中定义了一个enum,例如MyEnum 我调用Q_ENUM(MyEnum)将其注册到元对象,并将整个类作为不可处理类型注册到QML 在我的第二个类(MyObject:QObjectwith macroQ_OBJECT)中,我有一个槽,它使用一个MyEnum作为参数。此对象作为常规类型注册到QML(可创建) 我想用MyEnum中的值从QML调用插槽-这失败了,因为类型MyEnumClass::MyEnum似乎未知 当枚举在带有插

我有一个类(例如
MyEnumClass
Q\u GADGET
),我在其中定义了一个
enum
,例如
MyEnum

我调用
Q_ENUM(MyEnum)
将其注册到元对象,并将整个类作为不可处理类型注册到QML

在我的第二个类(
MyObject:QObject
with macro
Q_OBJECT
)中,我有一个槽,它使用一个
MyEnum
作为参数。此对象作为常规类型注册到QML(可创建)

我想用
MyEnum
中的值从QML调用插槽-这失败了,因为类型
MyEnumClass::MyEnum
似乎未知

当枚举在带有插槽的类中定义时,它可以正常工作


MVCE

class MyEnumClass {
    Q_GADGET
public:
    enum MyEnum {
        E1,
        E2,
        E3
    };
    Q_ENUM(MyEnum)
};


class MyObject : public QObject
{
    Q_OBJECT

public:
    MyObject(QObject* parent = nullptr) : QObject(parent) {}

    enum TestEnum {
        V1,
        V2,
        V3
    };
    Q_ENUM(TestEnum)

public slots:
    void testFun1(MyEnumClass::MyEnum val) { qDebug() << val; }
    void testFun2(TestEnum val) { qDebug() << val; }
};

我尝试在
MyObject
中继承
MyEnumClass
以使枚举成为
MyObject
的一部分,我尝试使用不同的宏和函数使枚举在MetaObjectSystem中更可用。。。无济于事

我还尝试将枚举放在一个名称空间中,如前所述——它对于插槽也是不可用的

我发现调用slot的唯一方法是删除枚举并使用int作为参数的类型-这不是很好


我怎样才能使它工作?
我缺少了什么技巧吗?

注册元类型:
qRegisterMetaType();
说明: 从文件:

此宏向元对象系统注册枚举类型。它必须 放置在具有Q_对象的类中的枚举声明之后 或者Q_GADGET宏。对于名称空间,请改用Q_ENUM_NS()

已注册的枚举也会自动注册到Qt 元类型系统,使它们为QMetaType所知,而无需 使用Q_DECLARE_METATYPE()

使用
Q_ENUM
会自动向元对象系统注册ENUM,所以您无需添加
Q\u DECLARE\u元类型(MyEnum)

但要在排队的信号插槽连接中使用枚举,属性。。。您需要注册元类型

如文件所述:

要在QVariant中使用类型T,可以使用Q_DECLARE_METATYPE() 够了。要在排队信号和插槽连接中使用T类型, 必须在创建第一个连接之前调用qRegisterMetaType() 建立

另外,要将类型T与QObject::property()API一起使用, qRegisterMetaType()必须在使用之前调用,通常在 在main()函数中使用T或的类的构造函数


谢谢,它起作用了。我很惊讶,因为我希望在使用
qmlRegister[unreatable]类型注册时隐式调用它们,而且它们在QML中可用,例如
console.log()
。我必须再次查看文档才能记住,但如果我没有记错的话,它与名称空间有关。我也只是浏览了一下文档,-但这至少在我的生产项目中不起作用。。。
qmlRegisterUncreatableType<MyEnumClass>("MyObject", 1, 0, "MyEnum", "Uncreatable");
qmlRegisterType<MyObject>("MyObject", 1, 0, "MyObject");
import MyObject 1.0
ApplicationWindow {
    id: window
    visible: true
    width: 600
    height: 600

    MyObject {
        id: obj
    }

    MouseArea {
        anchors.fill: parent
        onClicked: {
            console.log(MyObject.V2)
            console.log(MyEnum.E2)
            obj.testFun2(MyObject.V2)
            obj.testFun1(MyEnum.E1)
        }
    }
}
qRegisterMetaType<MyEnumClass::MyEnum>();