如何通过Qt原生功能获取Qt::Alignment原枚举值字符串而非同义词?
Qt原生方式获取Qt::Alignment枚举的原标志名而非同义词
问题描述
使用QVariant::toString()转换Qt::Alignment类型的标志值时,会返回同义词而非原枚举名。例如执行以下代码:
QString s = QVariant::fromValue<Qt::Alignment>(Qt::AlignTop | Qt::AlignLeft).toString();
得到的结果是AlignLeading|AlignTop,但Qt::AlignLeading是Qt::AlignLeft的同义词。我们需要获取原枚举值对应的名称(和Qt Designer属性编辑器显示的一致),且希望采用无需hack的Qt原生实现方式。
解决方案
直接利用Qt的QMetaEnum即可实现,这是原生无hack的方案,与Qt Designer使用的是同一套元数据:
- 获取
Qt::Alignment对应的元枚举对象:
const QMetaEnum metaEnum = QMetaEnum::fromType<Qt::Alignment>();
- 编写工具函数遍历枚举键,匹配标志位后拼接原名称:
QString alignmentToString(Qt::Alignment align) { const QMetaEnum metaEnum = QMetaEnum::fromType<Qt::Alignment>(); QStringList nameList; for (int i = 0; i < metaEnum.keyCount(); ++i) { const int enumValue = metaEnum.value(i); if (enumValue != 0 && (align & enumValue) == enumValue) { nameList += QLatin1String(metaEnum.key(i)); } } return nameList.join(QLatin1String("|")); }
- 测试验证:调用
alignmentToString(Qt::AlignTop | Qt::AlignLeft),返回结果为AlignLeft|AlignTop,完全是原枚举定义的名称,不会出现同义词。
原理说明
QMetaEnum直接读取Qt元对象系统中注册的原始枚举键名,这些名称是枚举定义时的原名,不会被同义词替换,因此能精准获取你需要的原标志名。
内容的提问来源于stack exchange,提问作者Atmo
相关产品推荐
相关产品推荐

