Qt_Q_ENUM使用 枚举字符串互转

目录

        • 1.简述
        • 2.Q_ENUM用法
            • 2.1 声明使用
            • 2.2 测试例子
        • 3.用模板实现一个字符串枚举互转
            • 3.1代码
            • 3.2 用法示例

1.简述

数据库里用到了枚举的存储,比如一个设备有两个状态,保持数据库和代码的可读性,当然是用枚举了,那就需要把枚举转成字符串存储进去,读的时候再转回来。
Qt_Q_ENUM使用 枚举字符串互转_第1张图片

Qt 中支持了枚举与字符串互转的用法,通过moc编译器实现,
所以使用的时候需要添加Q_OBJECT宏继承QObject
并且声明为public属性,以便外部使用。

2.Q_ENUM用法

2.1 声明使用
class Dialog : public QDialog
{
     
    Q_OBJECT
public:
    enum EnmState{
     
        ENM_STATE_A = 0,
        ENM_STATE_B = 2,
        ENM_STATE_C,
    };
    Q_ENUM(EnmState);
};
2.2 测试例子

尝试一下QMetaEnum提供的各种功能

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

3.用模板实现一个字符串枚举互转

3.1代码
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);
    }
}
3.2 用法示例
	 //字符串转枚举
     CEnmDef::EnmDevSwitch enmVal = CEnmDef::strToEnm<CEnmDef::EnmDevSwitch>("ENM_SWITCH_ON");
     //枚举转字符串
     QString strSwitch = CEnmDef::enmToStr<CEnmDef::EnmDevSwitch>(CEnmDef::ENM_SWITCH_ON);

你可能感兴趣的:(Qt,c++,Qt)