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

摘要:
回想起

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
constQMetaObject &mo = [ClassName]::staticMetaObject;
intindex = mo.indexOfEnumerator("[EnumName]");
QMetaEnum me = mo.enumerator(index);

若 enum 定义在当前类中,则可以简写为

1
2
intindex = staticMetaObject.indexOfEnumerator("[EnumName]");
QMetaEnum me = staticMetaObject.enumerator(index);

二、enum 转换

1、 enum <-> int

1
enumColor { Red, White, Blue};Color c = (Color)1;   //c=Whiteint i = Red;       //i=0

2、 enum <-> string

1
enumColor { Red, White, Blue};
1
QString s = "White";
1
intidx = 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,问题就解决了。切记!!!

免责声明:文章转载自《QT枚举类型与字符串类型相互转换》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇Windows Server 2008 R2入门之用户管理[Java] 判断一个list是否包含于另一个list,如果没有,输出没包含的下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

枚举Enum 的常用方法

一、枚举介绍 通常定义常量方法和枚举定义常量方法区别 public class State { public static final int ON = 1; public static final Int OFF= 0; } 第一、它不是类型安全的。 你必须确保是int,其次,你还要确保它的范围是0和1。...

Mybatis枚举映射异常

异常描述: org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.executor.result.ResultMapException: Error attempting to get column 'xxx' from result set. Ca...

swift 枚举

枚举 枚举不是类型..而是值.枚举定义了一个通用类型的一组相关的值 什么时候用枚举? 一组通用类型,用枚举..需要存储可能会改变的数据使用相关值..存储唯一且不变的值使用原始值 通用类型: 方向 : 枚举成员类型本身就不同..所以不需要值 码,条形码,二维码:都是码,枚举成员类型不同,但需求每个码中存储值...相关值 枚举的值: 1.可以再枚举中存储...

Win32汇编操作注册表

1.打开和关闭子键 注册表函数对注册表的操作是通过句柄来完成的,与文件操作一样,在对某个键下的子键或者键值项进行操作之前,需要先将这个键打开,然后使用键句柄来引用这个键,在操作完毕以后再将键句柄关闭。注册表的根键不需要打开,它们的句柄是固定不变的,要使用根键的时候只要把这些句柄直接拿来用就是了,Windows.inc中已经预定义了它们的数值: HKEY_C...

java~使用枚举来实现接口的多态

java的enum类型,与C#不一样,它就是一个类,它可以实现接口,并且,可以通过的不同的枚举值来实现一个接口,这就是枚举的多态性。 下面的例子,在Hello接口有方法print,在枚举Strategy中,通过不同的枚举值分别实现了Hello接口,如下代码 enum Strategy implements Hello { CHINA()...

java 枚举类型enum 的使用

java枚举类型enum的使用 最近跟同事讨论问题的时候,突然同事提到我们为什么java中定义的常量值不采用enmu枚举类型,而采用public final static类型来定义呢?以前我们都是采用这种方式定义的,很少采用enum定义,所以也都没有注意过,面对突入起来的问题,还真有点不太清楚为什么有这样的定义。既然不明白就抽时间研究下吧。 Java中的枚...