如何在QString.arg()中使用我的枚举?

时间:2015-09-17 20:40:36

标签: c++ qt enums string-formatting qstring

我的枚举被声明为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;

我该如何解决这个问题?

2 个答案:

答案 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));