QT中枚举的使用

QT有自己的枚举机制,可以很方便的获取类内枚举信息

Posted by 雯饰太一 on June 25, 2023

QT中枚举的使用

废话不多说,先上代码:

头文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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);
};

源文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
#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中单独开一个函数,将工程中所有使用的枚举量都注册进来才行,且这个注册的过程是在程序开始时需要先行完成才可以。