廢話不多說浪腐,先上代碼:
頭文件
class QString;
template <class Key, class T> class QMap;
class EnumMapContainer :public QObject
{
Q_OBJECT
public:
EnumMapContainer();
~EnumMapContainer();
bool GetEnumValue(const QString& enumStr, int& enumValue);
private:
QMap<QString, int>* m_enumMap;//[枚舉值字符串-枚舉值]
void ConfigL4NodeMap();
public:
enum L3NodeType
{
L3NT_NULL = 0,
L3NT_Show,//節(jié)點的展示模式
L3NT_Data,//節(jié)點的數(shù)據(jù)來源
};
Q_ENUM(L3NodeType);
};
源文件
#include "EnumMapContainer.h"
#include <QMap>
EnumMapContainer::EnumMapContainer()
{
m_enumMap = new QMap<QString, int>;
ConfigL4NodeMap();
}
EnumMapContainer::~EnumMapContainer()
{
m_enumMap->clear();
delete m_enumMap;
}
bool EnumMapContainer::GetEnumValue(const QString& enumStr, int& enumValue)
{
if (m_enumMap->contains(enumStr))
{
enumValue = (*m_enumMap)[enumStr];
return true;
}
return false;
}
template<class EnumClass>
void ConfigMap(QMap<QString, int>& eMap)
{
QMetaEnum e = QMetaEnum::fromType<EnumClass>();
if (!e.isValid()) return;
for (int i = 0; i < e.keyCount(); i++)
{
QString enumValStr = e.valueToKey(e.value(i));
eMap[enumValStr] = e.value(i);
}
}
void EnumMapContainer::ConfigL4NodeMap()
{
//這里應(yīng)該已經(jīng)不能再簡潔了纵揍,除非耗費更多的代碼做eunm類型的映射,而且不一定有
ConfigMap<EnumMapContainer::L3NodeType>(*m_enumMap);
}
備注:
- 必須要有Q_OBJECT宏议街,才能使用QT的這個特性泽谨;在構(gòu)建map的時候就不用進行傳統(tǒng)操作了;
- 一個類里面可以有很多個enum量特漩,只要是名稱不同即可吧雹;
- 但是這種enum量使用的時候,必須加上類名涂身,其他位置不能直接使用雄卷,但是更容易理解;
注:這種map是使用字符串進行構(gòu)建的蛤售,后來我又實現(xiàn)了一種方式丁鹉,直接識別枚舉類型妒潭,再在當前類型中對枚舉值進行管理,但是這種情況揣钦,構(gòu)建map的時候不能自動構(gòu)建了雳灾,只能在某個cpp中單獨開一個函數(shù),將工程中所有使用的枚舉量都注冊進來才行冯凹,且這個注冊的過程是在程序開始時需要先行完成才可以谎亩。