如何实现像Qt::LeftDockWidgetArea这样的枚举名称
How to achieve enum names like Qt::LeftDockWidgetArea
当使用Qt时,许多函数采用像标志Qt::LeftDockWidgetArea这样的参数。
即使我浏览了Qt资源,我也无法理解如何实现此命名行为。是通用的C++还是Qt特定的?
假设我有一个类 MyClass:
class MyClass {
public:
MyClass();
void setFlag(???);
};
我想像这样调用 setFlag 方法:
MyClass mc;
mc.setFlag(MyClass::flag1 | MyClass::flag2)
flag1 和 flag2 应该只是 0x01 & 0x02,这是一个枚举吗?我必须在哪里声明?该方法的论点是什么?
如果这很明显,我很抱歉,但我不明白。
解决方案(来自答案)
非常好。通过阅读下面的答案,我添加了以下内容:(请注意,我真的不需要标志,只需要枚举中的数字,这简化了很多)
namespace MyNames {
typedef enum {
FA = 0,
FB = 1
} Field;
}
class MyClass
{
public:
MyClass();
char getField(MyNames::Field f) const;
};
这确实允许以下调用(不):
mc.getField(MyNames::FA) //OK
mc.getField(1) //not OK
看看Qt::LeftDockWidgetArea
的定义:
enum DockWidgetArea {
LeftDockWidgetArea = 0x1,
RightDockWidgetArea = 0x2,
TopDockWidgetArea = 0x4,
BottomDockWidgetArea = 0x8,
DockWidgetArea_Mask = 0xf,
AllDockWidgetAreas = DockWidgetArea_Mask,
NoDockWidgetArea = 0
};
Q_DECLARE_FLAGS(DockWidgetAreas, DockWidgetArea)
请注意Q_DECLARE_FLAGS
宏,通过创建 QFlags
typedef 可以实现您要求的行为。请参阅 http://qt-project.org/doc/qt-4.8/qflags.html#Q_DECLARE_FLAGS。
如果你仔细查看Qt文档(http://doc.qt.io/archives/qt-4.7/qt.html#DockWidgetArea-enum 针对你的特定情况),你会发现Qt使用模板化的QFlags类以类型安全的方式存储枚举值的OR组合。
编辑:看起来有两种答案,因为你的问题不是很清楚。仔细阅读您的问题后,我认为以下是您想要的。
class MyClass {
public:
enum Flags{
Flag1 = 0x01,
Flag2 = 0x02
}
MyClass();
void setFlag(int Flags);//Not type-safe but works.
void setFlag(Flags<MyClass::Flags> Flags);//Type-safe but you have to create a Flags class yourself
};
更多的解释可以在这里的一个老问题中找到:如何在C++中使用枚举作为标志?
您会在srccorelibglobalqnamespace.h
中找到这个(或类似的东西):
#ifndef Q_MOC_RUN
namespace
#else
class Q_CORE_EXPORT
#endif
Qt {
这通常变得简单
namespace Qt {
要引用在此 Qt
命名空间中声明的名称(例如 LeftDockWidgetArea
),请在其前面加上 Qt::
。
- 没有找到相关文章