【问题标题】:Can you iterate over each possible enum value using a Qt foreach loop?您可以使用 Qt foreach 循环遍历每个可能的枚举值吗?
【发布时间】:2012-05-03 00:42:34
【问题描述】:

给定一个枚举:

enum AnEnum { Foo, Bar, Bash, Baz };

您可以使用 Qt 的 foreach 循环遍历这些枚举中的每一个吗?

这段代码无法编译(不是我期望的……)

foreach(AnEnum enum, AnEnum)
{
// do nothing
}

【问题讨论】:

  • 错误信息是什么意思? enum 类型不是像数据结构那样迭代其元素的容器。

标签: c++ qt enums foreach


【解决方案1】:

如果将其移动到 QMetaEnum 中,则可以像这样对其进行迭代:

QMetaEnum e = ...;
for (int i = 0; i < e.keyCount(); i++)
{
    const char* s = e.key(i); // enum name as string
    int v = e.value(i); // enum index
    ...
}

http://qt-project.org/doc/qt-4.8/qmetaenum.html

使用作为 QMetaEnum 的 QNetworkReply 的示例:

QNetworkReply::NetworkError error;
error = fetchStuff();
if (error != QNetworkReply::NoError) {
    QString errorValue;
    QMetaObject meta = QNetworkReply::staticMetaObject;
    for (int i=0; i < meta.enumeratorCount(); ++i) {
        QMetaEnum m = meta.enumerator(i);
        if (m.name() == QLatin1String("NetworkError")) {
            errorValue = QLatin1String(m.valueToKey(error));
            break;
        }
    }
    QMessageBox box(QMessageBox::Information, "Failed to fetch",
                "Fetching stuff failed with error '%1`").arg(errorValue),
                QMessageBox::Ok);
    box.exec();
    return 1;
}

【讨论】:

    【解决方案2】:

    foreach 在 Qt 中绝对只适用于 Qt 容器。它在文档here 中有说明。

    【讨论】:

      【解决方案3】:

      有一个更简单的版本用于检索 QMetaEnum 对象(Qt 5.5 及更高版本):

          QMetaEnum e = QMetaEnum::fromType<QLocale::Country>();
          QStringList countryList;
      
          for (int k = 0; k < e.keyCount(); k++)
          {
              QLocale::Country country = (QLocale::Country) e.value(k);
              countryList.push_back(QLocale::countryToString(country));
          }
      

      【讨论】:

        猜你喜欢
        • 2011-11-28
        • 1970-01-01
        • 2012-07-07
        • 1970-01-01
        • 2012-11-10
        • 2011-08-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多