废话不多说,先上代码:
头文件
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,//节点的展示模式
L3NT_Data,//节点的数据来源
};
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()
{
//这里应该已经不能再简洁了,除非耗费更多的代码做eunm类型的映射,而且不一定有
ConfigMap<EnumMapContainer::L3NodeType>(*m_enumMap);
}
备注:
- 必须要有Q_OBJECT宏,才能使用QT的这个特性;在构建map的时候就不用进行传统操作了;
- 一个类里面可以有很多个enum量,只要是名称不同即可;
- 但是这种enum量使用的时候,必须加上类名,其他位置不能直接使用,但是更容易理解;
注:这种map是使用字符串进行构建的,后来我又实现了一种方式,直接识别枚举类型,再在当前类型中对枚举值进行管理,但是这种情况,构建map的时候不能自动构建了,只能在某个cpp中单独开一个函数,将工程中所有使用的枚举量都注册进来才行,且这个注册的过程是在程序开始时需要先行完成才可以。