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