如何从 QString 设置Q_ENUM

How can I set an Q_ENUM from a QString

本文关键字:ENUM 设置 QString      更新时间:2023-10-16

我正在尝试从QString设置Q_ENUM,但我不知道该怎么做。有这方面的经验吗?

枚举示例(也适用于普通枚举):

enum class MyEnumType
{
   foo,
   bar
};
Q_ENUM(MyEnumType)

我发现最简单的方法是这样的,使用 2 个基本行:

auto&& metaEnum = QMetaEnum::fromType<MyEnumType>();
MyEnumType wantedEnum = static_cast<MyEnumType>(metaEnum.keyToValue("foo")));

请注意,仅在字符串不为空时才执行keyToValue,使用 !yourString.isEmpty() .就我而言,枚举值最终被0xFF在内存中。我没有在代码片段中包含它,因为此检查取决于您的实现。

您需要

从 QMetaObject 中获取匹配的 QMetaEnum 以用于声明Q_ENUM的基于 QObject 的类型。一旦有了它,你就可以得到字符串表示的整数。对于具有一个名为 EnumName 的枚举的示例类 MyEnumContainer,该枚举具有一个名为 SomeKeyInEnumName 的条目,这可能如下所示:

QMetaObject* metaObject = MyEnumContainer::staticMetaObject();
int enumIndex = metaObject->indexOfEnumerator("EnumName");
QMetaEnum enum = metaObject->enumerator(enumIndex);
int enumValue = enum.keyToValue("SomeKeyInEnumName");

对于QMetaEnum中的其他有用技巧,https://doc.qt.io/qt-5/qmetaenum.html 应该给你一些想法。