如何实现像Qt :: LeftDockWidgetArea这样的枚举名称

HWe*_*nde 2 c++ enums qt

当使用Qt时,许多函数采用类似标志Qt :: LeftDockWidgetArea的参数.

即使我查看了Qt源代码,我也无法理解如何实现这种命名行为.它是普通的C++还是Qt特有的?

假设我有一个MyClass类:

class MyClass {
    public:
        MyClass();
        void setFlag(???);
};
Run Code Online (Sandbox Code Playgroud)

我想像这样调用setFlag方法:

MyClass mc;
mc.setFlag(MyClass::flag1 | MyClass::flag2)
Run Code Online (Sandbox Code Playgroud)

flag1和flag2应该只是0x01和0x02,这是枚举吗?我必须在哪里声明?这个方法的论点是什么?

如果这很明显,我很抱歉,但我不明白.

解决方案(来自答案)

很好.从阅读下面的答案我添加了这个:(请注意,我没有真正需要标志,只是来自枚举的数字,这简化了很多)

namespace MyNames {
    typedef enum {
        FA = 0,
        FB = 1
    } Field;
}

class MyClass
{
    public:
        MyClass();
        char getField(MyNames::Field f) const;
};
Run Code Online (Sandbox Code Playgroud)

这确实允许以下调用(不是):

mc.getField(MyNames::FA) //OK
mc.getField(1)           //not OK
Run Code Online (Sandbox Code Playgroud)

hc_*_*hc_ 6

看看定义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)
Run Code Online (Sandbox Code Playgroud)

请注意Q_DECLARE_FLAGS宏,通过创建QFlagstypedef实现您要询问的行为.请参阅http://qt-project.org/doc/qt-4.8/qflags.html#Q_DECLARE_FLAGS.