你能否使用Qt foreach循环遍历每个可能的枚举值?

12

给定一个枚举类型:

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

你能使用 Qt 的 foreach 循环迭代这些枚举吗?

这段代码无法编译(虽然我并不指望它能...)

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

错误信息是什么?“枚举”类型不像容器一样的数据结构,无法迭代其元素。 - Mahesh
3个回答

17

如果将其移动到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

使用 QNetworkReply 的示例,该类是 QMetaEnum 类的一种。

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
在Qt中,foreach绝对只适用于Qt容器。文档在这里说明了这一点。

2

有一个更简单的方式可以检索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));
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接