我的枚举被声明为Q_ENUM
宏,因此当与qDebug()
(因为我使用QT 5.5)而不是其值一起使用时,它会打印枚举字段的名称。我想对QString().arg()
执行相同的操作,因此我使用Q_DECLARE_METATYPE()
宏声明了相同的枚举,但它也没有工作,并给出以下错误。
代码:
qDebug() << QString("s = %1").arg(myClass::myEnum::ok);
错误:
错误:没有匹配的调用函数 &#39;的QString :: ARG(MyClass的:: myEnum)&#39;
我该如何解决这个问题?
答案 0 :(得分:1)
Q_ENUM不提供直接转换为某种字符串值,因此您必须使用QMetaEnum:
qDebug() << QStringLiteral("s = %1").arg(QMetaEnum::fromType<MyClass::Priority>().valueToKey(static_cast<int>(myClass::myEnum::ok));
static_cast当然是必需的。
答案 1 :(得分:1)
您可以使用以下conversion helper:
template <typename T>
typename QtPrivate::QEnableIf<QtPrivate::IsQEnumHelper<T>::Value , QString>::Type
toString(T enumValue)
{
auto mo = qt_getEnumMetaObject(enumValue);
auto enumIdx = mo->indexOfEnumerator(qt_getEnumName(enumValue));
return QLatin1String(mo->enumerator(enumIdx).valueToKey(enumValue));
}
然后它变得很简单:
qDebug() << QString::fromLatin1("s = %1").arg(toString(myClass::myEnum::ok));