enum(ALIGNMENT){
LEFT=0,
CENTER,
RIGHT
)
QEnum(ALIGNMENT)
위의 내용을 기준으로
LEFT(0)으로부터 문자 "LEFT" 얻어오는 방법과
반대로 "LEFT"로부터 LEFT(0)을 얻어오는 방법에 대하여 고민해보자
구글링을 통하여 enum의 label을 문자열로 받는 방법은 있었는데 반대의 경우는 자세히 보지 못해서인지 못 찾았다.
그래서 고민 끝에 만들어 보았다.(내가 처음 만들었다는 소리는 아니다)
template<typename T>
QString enumToString(T value)
{
int castValue = static_cast<int>(value);
return QMetaEnum::fromType<T>().valueToKey(castValue);
}
Version#1
template<typename T>
T stringToEnum(QString keyStr, T defaultValue = (T)0)
{
T retVal = defaultValue;
QMetaEnum meta = QMetaEnum::fromType<T>();
for(int idx = 0; idx<meta.keyCount(); idx++){
if(!QString(meta.valueToKey(meta.value(idx))).compare(keyStr,Qt::CaseInsensitive)){
retVal = (T)meta.value(idx);
break;
}
}
return retVal;
}
Version#2
template<typename T>T stringToEnum(QString keyStr, T defaultValue = (T)0){T retVal;bool bOK = false;QMetaEnum meta = QMetaEnum::fromType<T>();T value = meta.keyToValue(keyStr.toLocal8Bit(),&bOK);if(bOK)retVal = value;elseretVal = defaultValue;return retVal;}
사용법
1. LEFT(0)으로부터 "LEFT" 얻어오기
QString left = enumToString(ALIGNMENT::LEFT);
2. "LEFT"로부터 LEFT(0) 얻어오기
ALIGNMENT left = stringToEnum<ALIGMENT>("LEFT");
※ Default 값이 0(LEFT)이므로 오탈자의 경우 "LEFT"만 나온다. (Default 값 변경 가능)