gpt4 book ai didi

qt - 对从 QML 调用的槽使用来自不同类(或命名空间)的 ENUM

转载 作者:行者123 更新时间:2023-12-01 16:17:29 25 4
gpt4 key购买 nike

我有一个类(例如 MyEnumClassQ_GADGET),我在其中定义了一个enum,例如MyEnum
我调用 Q_ENUM(MyEnum) 将其注册到元对象,并将整个类注册为 QML 的不可创建类型。

在我的第二个类(带有宏Q_OBJECTMyObject : QObject)中,我有一个使用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; }
};

在main.cpp中:

qmlRegisterUncreatableType<MyEnumClass>("MyObject", 1, 0, "MyEnum", "Uncreatable");
qmlRegisterType<MyObject>("MyObject", 1, 0, "MyObject");

在main.qml中:

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)
}
}
}
<小时/>

我尝试继承MyObject中的MyEnumClass以使枚举成为MyObject的一部分,我尝试使用不同的宏和函数来制作枚举在 MetaObjectSystem 中甚至有更多可用...但无济于事。

我还尝试将枚举放入命名空间中,如here所述- 它也无法用于插槽。

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

<小时/>

我怎样才能做到这一点?
我还缺少什么技巧吗?

最佳答案

注册元类型:

qRegisterMetaType<MyEnumClass::MyEnum>();

说明:

来自Q_ENUM( ...)文档:

This macro registers an enum type with the meta-object system. It must be placed after the enum declaration in a class that has the Q_OBJECT or the Q_GADGET macro. For namespaces use Q_ENUM_NS() instead.

...

Registered enumerations are automatically registered also to the Qt meta type system, making them known to QMetaType without the need to use Q_DECLARE_METATYPE().

使用Q_ENUM自动向元对象系统注册枚举,因此您无需添加Q_DECLARE_METATYPE(MyEnum)

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

正如 int qRegisterMetaType() 中所述文档:

To use the type T in QVariant, using Q_DECLARE_METATYPE() is sufficient. To use the type T in queued signal and slot connections, qRegisterMetaType() must be called before the first connection is established.

Also, to use type T with the QObject::property() API, qRegisterMetaType() must be called before it is used, typically in the constructor of the class that uses T, or in the main() function.

关于qt - 对从 QML 调用的槽使用来自不同类(或命名空间)的 ENUM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50835442/

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