美文网首页
QT中枚举的使用

QT中枚举的使用

作者: 雯饰太一 | 来源:发表于2023-07-22 23:40 被阅读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);
}

备注:

  • 必须要有Q_OBJECT宏,才能使用QT的这个特性;在构建map的时候就不用进行传统操作了;
  • 一个类里面可以有很多个enum量,只要是名称不同即可;
  • 但是这种enum量使用的时候,必须加上类名,其他位置不能直接使用,但是更容易理解;

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

相关文章

网友评论

      本文标题:QT中枚举的使用

      本文链接:https://www.haomeiwen.com/subject/jufiydtx.html