7

例如,我有以下课程:

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 ?

尝试了this answer中的方法,但出现以下错误:

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 中学习更多技巧也会很好。

4

3 回答 3

9

不,没有,因为Q_ENUM的功能是在 moc 生成的代码中实现的,并且 moc 会忽略既不是Q_OBJECT也不是的类Q_GADGET。没有理由不使用 a 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。

于 2016-06-07T13:04:26.270 回答
4

Q_ENUM就像旧的一样,Q_ENUMS但有以下不同:

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

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

于 2016-06-07T11:45:33.300 回答
3

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

namespace MyLibrary
{ 
Q_NAMESPACE 

enum class MYLIBRARYSHARED_EXPORT MyEnumClass
{
...
}; 

Q_ENUM_NS(MyEnumClass)

...
} // namespace MyLibrary
于 2019-03-01T10:48:48.077 回答