Q_ENUM的作用以及QMetaEnum的优势

理论基础:

一,Q_ENUM

用Q_ENUM,就可以将自定义枚举类型注册到Qt的元对象系统中,从而实现枚举到各种类型的转换。

既然是元对象系统,就会使用Moc编译,因此,枚举类型需要放在继承于添加了Q_OBJECT宏继承QObject的类中;并且声明为public属性,以便外部使用。

二,QMetaEnum

QMetaEnum实现了字符串到枚举,枚举到字符串的转换,以及一些其他的转换,这样可以增加代码的可读性。具体大家可以在帮助手册中看看QMetaEnum的接口。

其他类转换到QMetaEnum 类型可以使用QMetaEnum::fromType()获取QMetaEnum对象。

使用举例

//声明自定义枚举
class Dialog : public QDialog
{
    Q_OBJECT
public:
    enum EnmState{
        ENM_STATE_A = 0,
        ENM_STATE_B = 2,
        ENM_STATE_C,
    };
    Q_ENUM(EnmState);
};

//测试

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    resize(820,540);

    QMetaEnum enmState = QMetaEnum::fromType<Dialog::EnmState>();//类型转换
    qDebug()<<enmState.name();//枚举的类型名称
    qDebug()<<enmState.keyCount();//键个数
    qDebug()<<enmState.isValid()<<enmState.scope();//是否有效 声明自哪个类
    qDebug()<<enmState.keyToValue("ENM_STATE_A"); //字符串转枚举
    qDebug()<<QString(enmState.valueToKey(ENM_STATE_A)); //枚举转字符串
    qDebug()<<QString(enmState.valueToKey(ENM_STATE_B));
    for(int i = 0;i < enmState.keyCount();i++){ //遍历枚举
        qDebug()<<QString(enmState.key(i))<<enmState.value(i);
    }
}
//查看打印输出
EnmState
3
true Dialog
0
"ENM_STATE_A"
"ENM_STATE_B"
"ENM_STATE_A" 0
"ENM_STATE_B" 2
"ENM_STATE_C" 3


实用模板函数

//模板定义
class CEnmDef:public QObject{
    Q_OBJECT
public:
     enum EnmDevSwitch{
         ENM_SWITCH_ON = 0,
         ENM_SWITCH_OFF,
     };
    Q_ENUM(EnmDevSwitch)
    
    template <typename EnmType>
    static EnmType strToEnm(QString strText)
    {
          QMetaEnum metaEnm = QMetaEnum::fromType<EnmType>();
          return (EnmType)metaEnm.keyToValue(strText.toStdString().data());
    }
    template <typename EnmType>
    static QString enmToStr(EnmType enmVal)
    {
        QMetaEnum metaEnm = QMetaEnum::fromType<EnmType>();
        return metaEnm.valueToKey(enmVal);
    }
}

//使用
	 //字符串转枚举
     CEnmDef::EnmDevSwitch enmVal = CEnmDef::strToEnm<CEnmDef::EnmDevSwitch>("ENM_SWITCH_ON");
     //枚举转字符串
     QString strSwitch = CEnmDef::enmToStr<CEnmDef::EnmDevSwitch>(CEnmDef::ENM_SWITCH_ON);

QMetaEnum在QVariant中的使用可以参考以下链接

Qt文档阅读笔记-Q_ENUM官方解析及实例 - 灰信网(软件开发博客聚合)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值