QT枚举类型与字符串类型相互转换

时间:2022-02-20 15:15:30

Qt5以后(具体版本可能是5.10吧,这个不确定)采用以下方法

https://www.cnblogs.com/dongc/p/5630444.html

在QT中将枚举类型注册(QT_Q_ENUM或QT_Q_FLAG)后,就可以利用QT的元对象进行枚举类型与字符串类型转换了。

代码示例:

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; }
QT枚举类型与字符串类型相互转换

在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,问题就解决了。切记!!!