目录
3、Q_NAMESPACE, Q_ENUM_NS 和 Q_FLAG_NS 命名空间
一、引用 枚举值宏 所解决的问题:
1、Q_ENUM
能够轻松完成枚举量和字符串之间的相互转化。
枚举参数显示的是 int 类型,如:3。3 这个信息对于我们 调试或打印日志 很不友好。
在方法内,我们并不知道这个 3 代表的是什么。为了解决这个问题,有了个很有用的特性:Q_ENUM
2、Q_FLAG
弥补 C++ 中结构体 无法组合使用,和 缺乏类型检查 的缺点,可以 拥有多个身份,如:
enum Roles
{
Admin = 1,
Member = 2
}
上述定义了两个身份:Admin 和 Member,如果一个用户想拥有两个身份应该怎么做?
Q_FLAG 就是为了解决这个问题而创造出来的。
二、手写枚举值和字符串之间的相互转化
typedef enum
{
SUNDAY,
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY
} WeekEnum;
1.使用 switch-case 进行装换
char * StringDirectionT(WeekEnum mWeek)
{
switch(mWeek)
{
case SUNDAY : return "SUNDAY";
case MONDAY : return "MONDAY";
case TUESDAY : return "TUESDAY";
case WEDNESDAY : return "WEDNESDAY";
case THURSDAY : return "THURSDAY";
case FRIDAY : return "FRIDAY";
case SATURDAY : return "SATURDAY";
default : printf("Illegal direction value!\n;
}
}
输出:
printf("The Week is %s \n",StringDirectionT(m_Week));
2.使用数组
char *a_Week[] = { "SUNDAY", "MONDAY", "TUESDAY","WEDNESDAY","THURSDAY","FRIDAY","FRIDAY","SATURDAY"};
输出:
然后直接根据vl_Week的值去对应的数组元素
3.使用宏定义
#define enumToStr(WEEEK) "\""#WEEK"\""
输出:
printf("The Week is %s",enumToStr(vl_Week));
三、QT 自带宏命令
Qt 使用一组宏命令来完成枚举量扩展功能的(正如Qt的其他核心机制一样),这些宏包括
Q_ENUM, Q_FLAG, Q_DECLARE_FLAGS,Q_DECLARE_OPERATORS_FOR_FLAGS,
Q_ENUM_NS, Q_FLAG_NS,
这些宏的实现原理和如何展开如何注册到 Qt 内核均不在本文的讲解范围,本文只讲应用。
1、Q_ENUM 的使用
首先讲解最简单明了的宏 Q_ENUM,先看代码:
#include <QObject>
class MyEnum : public QObject
{
Q_OBJECT
public:
explicit MyEnum(QObject *parent = nullptr);
enum Priority
{
High = 1,
Low = 2,
VeryHigh =