QT 快速构建简单枚举类,实现随用随取

目录

1、QT 枚举类型enum 基本使用

2、QT QMetaEnum枚举器的基本使用 

3、QT 通过使用枚举类型enum和QMetaEnum枚举器构建一个简单的枚举类

4、QT 测试枚举类(简单调用和switch case使用)


1、QT 枚举类型enum 基本使用

         在.h文件中定义:

/* Roster枚举类型声明 */
    enum Roster
    {
        Tony,
        Shady,
        Bill,
        Teres,
        Presa
    };

    //Roster枚举类型注册
    Q_ENUM(Roster);

         在声明枚举类型时,若无特殊声明,枚举类型会自动分配,此时在Roster中声明的五个枚举类型会自动分配为整型,即Tony代表为0,Shady代表1...

        在.h文件中声明完后,还需要将声明好的枚举类型注册到QT系统中去,此时需要注意到是我们采用的Q_ENUM()宏注册需要在类内声明,并且此类还必须是继承于QObject和拥有Q_OBJECT宏。

        在.cpp文件中简单使用:

    Roster roster;
    roster = Tony;
    
    /* 此时条件①与条件②等价 */
    
    if(roster == Tony){    //条件①
        //执行代码1
    }
    
    if(roster == 0){    //条件②
        //执行代码2
    }

2、QT QMetaEnum枚举器的基本使用 

         首先要使用QMetaEnum枚举器必须包含头文件:

#include <QMetaEnum>

         QMetaEnum类是专门进行枚举类型进行数据存储、查找、转化等功能的类,通过QMetaEnum类自带的fromType<>()函数就能够将枚举类型的数据导入到QMetaEnum类中。QMetaEnum类自带的函数还有很多,有兴趣的小伙伴们可以自行去了解一下,在这里就不一一展开了。

//枚举类导入枚举器
    meta = QMetaEnum::fromType<Roster>();

3、QT 通过使用枚举类型enum和QMetaEnum枚举器构建一个简单的枚举类

        通过枚举类我们可以构建一个自己的枚举类型Ship,并且将它注册后转存到枚举器QMetaEnum中去,通过枚举器自带的函数就能够进行枚举类字符串和数字的映射关系了。

        在整个映射的过程中,运用到了一个中间容器QStringList,通过这个容器作为纽带就能将映射关系建立起来。话不多说,上代码:

        .h完整代码:

#ifndef ENUM_H
#define ENUM_H

#pragma once

#include <QObject>
#include <QWidget>
#include <QDebug>
#include <QMetaEnum>


class Enum : public QObject
{
    Q_OBJECT
public:
    Enum();
    ~Enum();

    /* 枚举类转化枚举器 */
    QMetaEnum meta;

    /* Roster枚举类型声明 */
    enum Roster
    {
        Tony,
        Shady,
        Bill,
        Teres,
        Presa
    };

    //Roster枚举类型注册
    Q_ENUM(Roster);

    /* Roster枚举类型的字符串导入位置 */
    QStringList name;


    /* Ship枚举类型声明 */
    enum Ship
    {
        ShipOf1,
        ShipOf2,
        ShipOf3,
        ShipOf4,
        ShipOf5
    };

    //Roster枚举类型注册
    Q_ENUM(Ship);

    /* Roster枚举类型的字符串导入位置 */
    QStringList ship;

    /**
     * @brief enumerateImports 枚举类导入函数方法
     * @param *list 字符串导入地址
     * @param data 枚举类对应的枚举器
     * @return void 无
     */
    void enumerateImports(QStringList *list,QMetaEnum data);

};

#endif // ENUM_H

        .cpp完整代码: 

#include "enum.h"

Enum::Enum()
    :QObject()
{
    //枚举类导入枚举器
    meta = QMetaEnum::fromType<Roster>();
    //枚举器导入QStringList
    enumerateImports(&name,meta);

    //枚举类导入枚举器
    meta = QMetaEnum::fromType<Ship>();
    //枚举器导入QStringList
    enumerateImports(&ship,meta);

}

Enum::~Enum()
{

}

void Enum::enumerateImports(QStringList *list, QMetaEnum data)
{
    for(int i = 0;i < data.keyCount();i++){
        QString enumStr = data.key(i);
        list->append(enumStr);
    }
}

        在这里我们写了一个建立纽带QStringList容器的通用办法的enumerateImports,在后面建立枚举类型的过程中,只需要调用这个通用函数即可。这样的话,建立一个完整的枚举类只需要几句代码就能够实现。

4、QT 测试枚举类(简单调用和switch case使用)

        .h文件中:

//实例化Enum类
    Enum allOfEnum;

          .cpp文件中测试效果:

//打印实例化类中的ship的字符串
    qDebug()<<allOfEnum.ship;
    //人为生成一个字符串变量
    QString shipExample = "ShipOf2";
    switch (allOfEnum.ship.indexOf(shipExample)) {
        case Enum::ShipOf1 :
        qDebug()<<"ShipOf1 is sail";
        break;
        case Enum::ShipOf2 :
        qDebug()<<"ShipOf2 is sail";
        break;
        case Enum::ShipOf3 :
        qDebug()<<"ShipOf3 is sail";
        break;
        case Enum::ShipOf4 :
        qDebug()<<"ShipOf4 is sail";
        break;
        case -1 :
        qDebug()<<"switch condition is error";
        break;
        default:
        qDebug()<<"QStringList is error";
        break;
    }

         输出结果:

 

        通过建立的映射关系实现switch case字符串使用,并且结构逻辑清晰,对于后续开发者也是十分友好的。

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值