有没有办法将 QMetaEnum 与属于非 Q_OBJECT 或 Q_GADGET class 的 Q_ENUMS 一起使用?
Is there a way to use QMetaEnum with Q_ENUMS belonging to non Q_OBJECT or Q_GADGET class?
例如我有以下 class:
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-Macros 来获得我想要的输出,但在 Qt 中学习更多技巧也很好。
Q_ENUM
类似于旧的 Q_ENUMS
,但有以下区别:
- 源代码中需要放在
enum
之后
- 宏中只能放一个
enum
- 它启用
QMetaEnum::fromType<T>()
。
- 这些
enum
自动声明为 QMetaType
(无需
将它们添加到 Q_DECLARE_METATYPE
中)。
enum
s 传递给 qDebug
将打印值的名称而不是
号码。
- 当放入
QVariant
时,toString()
给出值名称。值名称
由 QCOMPARE
打印(自 Qt 5.6 起)
摘自 WOBOQ blog post on the topic,阅读它以获取有关 Q_ENUM
与 Q_ENUMS
的更多信息。
没有,因为Q_ENUM
的功能是在moc生成的代码中实现的,moc忽略了既不是Q_OBJECT
也不是[=14=的类 ].没有理由不使用 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
例如我有以下 class:
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-Macros 来获得我想要的输出,但在 Qt 中学习更多技巧也很好。
Q_ENUM
类似于旧的 Q_ENUMS
,但有以下区别:
- 源代码中需要放在
enum
之后 - 宏中只能放一个
enum
- 它启用
QMetaEnum::fromType<T>()
。 - 这些
enum
自动声明为QMetaType
(无需 将它们添加到Q_DECLARE_METATYPE
中)。 enum
s 传递给qDebug
将打印值的名称而不是 号码。- 当放入
QVariant
时,toString()
给出值名称。值名称 由QCOMPARE
打印(自 Qt 5.6 起)
摘自 WOBOQ blog post on the topic,阅读它以获取有关 Q_ENUM
与 Q_ENUMS
的更多信息。
没有,因为Q_ENUM
的功能是在moc生成的代码中实现的,moc忽略了既不是Q_OBJECT
也不是[=14=的类 ].没有理由不使用 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