C++ 可以使用Qt foreach循环迭代每个可能的枚举值吗?

C++ 可以使用Qt foreach循环迭代每个可能的枚举值吗?,c++,qt,enums,foreach,C++,Qt,Enums,Foreach,给定一个枚举: enum AnEnum { Foo, Bar, Bash, Baz }; 您可以使用Qt的foreach循环迭代每个枚举吗 这段代码没有编译(不是我期望的…) Qt中的foreach显然只适用于Qt容器。文档中有说明。如果将其放入QMetaEnum中,您可以像这样对其进行迭代: QMetaEnum e = ...; for (int i = 0; i < e.keyCount(); i++) { const char* s = e.key(i); // enum

给定一个枚举:

enum AnEnum { Foo, Bar, Bash, Baz };
您可以使用Qt的foreach循环迭代每个枚举吗

这段代码没有编译(不是我期望的…)


Qt中的foreach显然只适用于Qt容器。文档中有说明。

如果将其放入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
    ...
}
qmetanum e=。。。;
对于(int i=0;i

使用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;
}
QNetworkReply::NetworkError错误;
error=fetchStuff();
if(错误!=QNetworkReply::无错误){
QString错误值;
QMetaObject meta=QNetworkReply::staticMetaObject;
对于(int i=0;i
有一个更简单的版本用于检索QMetaEnum对象(Qt 5.5及更高版本):

QMetaEnum e=QMetaEnum::fromType();
QStringList国家列表;
对于(int k=0;k
错误消息是怎么说的<代码>枚举
类型不是像容器一样的数据结构,无法在其元素上进行迭代。
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;
}
    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));
    }