QT中枚举的使用

2023-07-22  本文已影响0人  雯饰太一

废话不多说,先上代码:

头文件

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);
}

备注:

注:这种map是使用字符串进行构建的,后来我又实现了一种方式,直接识别枚举类型,再在当前类型中对枚举值进行管理,但是这种情况,构建map的时候不能自动构建了,只能在某个cpp中单独开一个函数,将工程中所有使用的枚举量都注册进来才行,且这个注册的过程是在程序开始时需要先行完成才可以。

上一篇 下一篇

猜你喜欢

热点阅读