理论基础:
一,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中的使用可以参考以下链接