2012-05-03 11 views
8

Biorąc pod uwagę enum:Czy możesz iterować po każdej możliwej wartości wyliczeniowej za pomocą pętli foreach Qt?

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

można iteracyjne nad każdym z tych teksty stałe za pomocą pętli foreach Qt?

Ten kod nie kompiluje (nie, że spodziewałem się, że ...)

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

Co robi błąd wiadomość powiedzieć? 'enum' type nie jest strukturą danych typu kontener, aby iterować po jej elementach. – Mahesh

Odpowiedz

11

Jeśli jest moced w QMetaEnum niż można iteracyjne nad nim tak:

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

Przykład wykorzystania QNetworkReply który jest 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

foreach w Qt jest zdecydowanie tylko dla kontenerów Qt. Jest to określone w dokumentach here.

Powiązane problemy