目录
- 1.简述
- 2.Q_ENUM用法
-
- 3.用模板实现一个字符串枚举互转
-
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);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)