Qt5以后(具体版本可能是5.10吧,这个不确定)采用以下方法
https://www.cnblogs.com/dongc/p/5630444.html
在QT中将枚举类型注册(QT_Q_ENUM或QT_Q_FLAG)后,就可以利用QT的元对象进行枚举类型与字符串类型转换了。
代码示例:
#include <QtCore/QMetaEnum>
int main() { QMetaEnum metaEnum = QMetaEnum::fromType<Qt::Alignment>(); //字符串转枚举值 Qt::Alignment alignment = (Qt::Alignment)metaEnum.keyToValue("Qt::AlignLeft"); alignment = (Qt::Alignment)metaEnum.keysToValue("Qt::AlignLeft | Qt::AlignVCenter"); //枚举值转字符串 const char* s = metaEnum.valueToKey(Qt::AlignCenter); return 0; }
在qss中我们可以这样使用枚举类型:
QTabBar#CustomTabBar {
/* Qt::AlignmentFlag定义 */ qproperty-text_align: "AlignLeft | AlignVCenter"; }
QT中判断信号是否与槽连接:
QPushButton btn;
int receivers = btn.receivers(SIGNAL(clicked(bool));
qt4.8则采用以下方法:
https://www.cnblogs.com/FindSelf/p/4901520.html
一、enum 自省
1
2
3
|
const QMetaObject &mo = [ClassName]::staticMetaObject;
int index = mo.indexOfEnumerator( "[EnumName]" );
QMetaEnum me = mo.enumerator(index);
|
若 enum 定义在当前类中,则可以简写为
1
2
|
int index = staticMetaObject.indexOfEnumerator( "[EnumName]" );
QMetaEnum me = staticMetaObject.enumerator(index);
|
二、enum 转换
1、 enum <-> int
1
|
enum Color { Red, White, Blue};Color c = (Color)1; //c=Whiteint i = Red; //i=0
|
2、 enum <-> string
1
|
enum Color { Red, White, Blue};
|
1
|
QString s = "White" ;
|
1
|
int idx = mo.indexOfEnumerator( "Color" );
|
QMetaEnum iEnum = mo.enumerator(idx);
int val = iEnum.keysToValue(s.toAscii());
1
|
Color c = (Color)val ;
|
如果是自定义类中的自定义枚举,如下操作
class [ClassName]:public QObject
{
Q_OBJECT
Q_ENUMS([EnumName])
public:
enum [EnumName]{
client_1=0,
client_2,
client_3,
client_4
};
};
使用的时候:
const QMetaObject &mo=[ClassName]::staticMetaObject;
int index = mo.indexOfEnumerator("[EnumName]");
QMetaEnum metaEnum = mo.enumerator(index);
const char *c=metaEnum.valueToKey(*****);
这里注意在class T内声明中添加Q_OBJECT 宏会经常有出现以下错误
undefined reference to staticMetaObject
解决办法:
重新执行qmake,记住每次你添加或者移除Q_GADGET or Q_OBJECT宏,一定要重新执行一遍qmake,问题就解决了。切记!!!