화요일, 10월 12, 2021

[QT C++] Enum과 QString

 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;
    else
        retVal = 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 값 변경 가능)