【问题标题】:How can I use my enum in QString.arg()?如何在 QString.arg() 中使用我的枚举?
【发布时间】:2015-09-17 20:40:36
【问题描述】:

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

代码:

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

错误:

错误:没有匹配的调用函数 'QString::arg(myClass::myEnum)'

我该如何解决这个问题?

【问题讨论】:

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


    【解决方案1】:

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

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

    枚举类当然需要static_cast。

    【讨论】:

    • 我实际上是在寻找一种方法让arg() 了解我的枚举类类型并在内部进行所有转换,而无需自己将枚举字段转换为其键值,就像当前qDebug()做。
    • 看看这里:woboq.com/blog/q_enum.html 我认为没有其他方法,除了向 Qt 的源代码贡献一个重载的 arg() 版本
    • 我已经阅读并获得了新的qDebug() 用于枚举的漂亮打印但我可以像他对qDebug() 所做的那样扩展qarg() 吗?
    • 嗯,好吧,看看我的评论,我写完后不久就编辑了。您可能可以编写一个(模板化的?)函数,该函数接受声明为 Q_ENUM 的枚举并将它们转换为 QString 或 char* 或其他任何东西,但 arg() 的另一个重载只有通过贡献 Qt 才能实现。
    • 好的,谢谢。我会写这个重载,如果值得为 QT 做出贡献
    【解决方案2】:

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

    【讨论】:

    • 好方法,我最终写了这样的东西。这是我的 (pastebin.com/78EzkfaZ)。但我真正想要的是以某种方式扩展arg(),以便它在内部执行此操作。我将关注 marius_linux 并尝试为 arg() 方法编写重载。挺好用的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-26
    相关资源
    最近更新 更多