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

How can I use my enum in QString.arg()?

我的枚举被声明为 Q_ENUM 宏,因此它在与 qDebug() 一起使用时打印枚举字段的名称(因为我使用的是 QT 5.5)而不是它的值。我想对 QString().arg() 做同样的事情,所以我用 Q_DECLARE_METATYPE() 宏声明了相同的枚举,但它也不起作用并给出以下错误。

代码:

qDebug() << QString("s = %1").arg(myClass::myEnum::ok);

错误:

error: no matching function for call to 'QString::arg(myClass::myEnum)'

我该如何解决这个问题?

Q_ENUM 不提供对某种字符串值的直接转换,因此您必须使用 QMetaEnum:

qDebug() << QStringLiteral("s = %1").arg(QMetaEnum::fromType<MyClass::Priority>().valueToKey(static_cast<int>(myClass::myEnum::ok));

static_cast 当然是枚举 class.

所必需的

您可以使用以下 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));