给定一个枚举:
enum AnEnum { Foo, Bar, Bash, Baz };
您可以使用 Qt 的 foreach 循环遍历这些枚举中的每一个吗?
这段代码无法编译(不是我期望的......)
foreach(AnEnum enum, AnEnum)
{
// do nothing
}
如果它被移动到 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;
}
foreach
在 Qt 中绝对只适用于 Qt 容器。此处的文档中有说明。
检索 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));
}