有没有办法将QMetaEnum与属于非Q_OBJECT或Q_GADGET类的Q_ENUMS一起使用

Is there a way to use QMetaEnum with Q_ENUMS belonging to non Q_OBJECT or Q_GADGET class?

本文关键字:类的 GADGET ENUMS 一起 OBJECT QMetaEnum 属于 有没有      更新时间:2023-10-16

例如,我有以下类:

namespace someName
{
    class someClass
    {
        Q_ENUMS(ESomeEnum)
        public:
        enum ESomeEnum {ENUM_A, ENUM_B, ENUM_C};
        // ... some other things ..
    }
}
Q_DECLARE_METATYPE(someName::someClass)
有没有办法使用 QMetaEnum::

valueToKey 或 QMetaEnum::keyToValue ?

尝试了此答案中的方法,但出现以下错误:

error: static assertion failed: QMetaEnum::fromType only works with enums declared as Q_ENUM or Q_FLAG
#define Q_STATIC_ASSERT_X(Condition, Message) static_assert(bool(Condition), Message)

我可以使用X宏来获得我想要的输出,但是在Qt中学习更多技巧也会很好。

不,没有,因为Q_ENUM的功能是在 moc 生成的代码中实现的,而 moc 忽略既不Q_OBJECT也不Q_GADGET的类。没有理由不使用Q_GADGET,因为它对对象大小没有影响:不添加虚拟方法或数据字段。

下面演示了这一点:

#include <QtCore>
namespace Ns {
class Class {
   Q_GADGET
public:
   enum ESomeEnum {ENUM_A, ENUM_B, ENUM_C};
   Q_ENUM(ESomeEnum)
};
}
int main() {
   auto metaEnum = QMetaEnum::fromType<Ns::Class::ESomeEnum>();
   qDebug() << sizeof(Ns::Class) << metaEnum.valueToKey(Ns::Class::ENUM_A);
}
#include "main.moc"

输出:

1 ENUM_A

在这个特定的平台(以及许多其他平台)上,空类的大小为 1。

是的,从 5.8 开始,您可以执行以下操作:

namespace MyLibrary
{ 
Q_NAMESPACE 
enum class MYLIBRARYSHARED_EXPORT MyEnumClass
{
...
}; 
Q_ENUM_NS(MyEnumClass)
...
} // namespace MyLibrary

Q_ENUM 与旧Q_ENUMS类似,但存在以下差异:

  • 它需要放在源代码中的enum之后。
  • 宏中只能放置一个enum
  • 它使QMetaEnum::fromType<T>() .
  • 这些enum s会自动声明为QMetaType s(无需将它们添加到Q_DECLARE_METATYPE中)。
  • 传递给qDebug enum将打印值的名称,而不是数字。
  • 当放入QVariant时,toString()给出值名。值名称由 QCOMPARE 打印(自 Qt 5.6 起)

摘自有关该主题的 WOBOQ 博客文章,请阅读它以获取有关Q_ENUMQ_ENUMS的更多信息。