有没有办法将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?
例如,我有以下类:
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_ENUM
与Q_ENUMS
的更多信息。
相关文章:
- 具有默认模板参数的多态类的模板推导失败
- 在全局变量中保存类的实例以重新创建类(创建"backup")
- std::具有相同基类的类的变体
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 在C++中,是否可以基于给定的标识符创建基类的新实例,反之亦然
- 无法访问嵌套类.类的使用无效
- 如何返回一个类的两个对象相加的结果
- C++中带有List类的迭代器Segfault
- 无法创建抽象类的实例
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 通过指向指针数组的指针访问子类的属性
- 如何比较自定义类的std::变体
- 继承:构造函数,初始化C++11中基类的类C数组成员
- 如何引用基类的派生类?
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 为什么我不能将一个对象push_back到属于另一个类的对象向量中?
- 类的C++属性似乎已重新初始化
- 为什么指针不写入类的地址?
- 如何将lambda作为模板类的成员函数参数
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)