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 macroQ_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>();