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

C++ 如何实现像Qt::LeftDockWidgetArea这样的枚举名称,c++,qt,enums,C++,Qt,Enums,在使用Qt时,许多函数都采用类似于标志Qt::LeftDockWidgetArea的参数 尽管我查看了Qt源代码,但我不明白如何实现 这种命名行为。它是通用C++还是Qt专用的?< /P> 假设我有一个类MyClass: class MyClass { public: MyClass(); void setFlag(???); }; 我想像这样调用setFlag方法: MyClass mc; mc.setFlag(MyClass::flag1 | MyC

在使用Qt时,许多函数都采用类似于标志Qt::LeftDockWidgetArea的参数

尽管我查看了Qt源代码,但我不明白如何实现 这种命名行为。它是通用C++还是Qt专用的?< /P> 假设我有一个类MyClass

class MyClass {
    public:
        MyClass();
        void setFlag(???);
};
我想像这样调用setFlag方法:

MyClass mc;
mc.setFlag(MyClass::flag1 | MyClass::flag2)
flag1和flag2应该只是0x01和0x02,这是一个枚举吗? 我要在哪里申报? 这个方法的论点是什么

如果这是显而易见的,我很抱歉,但我不明白

解决方案(来自答案)

很好。通过阅读下面的答案,我添加了以下内容: (请注意,我实际上并不需要标志,只需要枚举中的数字,这大大简化了它)

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

您可以在
src\corelib\global\qnamespace.h
中找到这个(或类似的内容):

#ifndef Q_MOC_RUN
namespace
#else
class Q_CORE_EXPORT
#endif
Qt {
这通常变得简单

namespace Qt {

若要引用此
Qt
命名空间中声明的名称(例如
LeftDockWidgetArea
),请在其前面加上
Qt:

,如果仔细查看Qt文档(针对您的特定情况),您将看到Qt使用模板化QFlags类以类型安全的方式存储枚举值或枚举值的组合

编辑:看起来有两种答案,因为你的问题不是很清楚。仔细阅读你的问题后,我认为以下是你想要的

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
};
class-MyClass{
公众:
枚举标志{
Flag1=0x01,
Flag2=0x02
}
MyClass();
void setFlag(int Flags);//不是类型安全的,但可以工作。
void setFlag(Flags);//键入safe,但您必须自己创建一个Flags类
};
更多的解释可以在这里的一个老问题中找到:

看看
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实现您所询问的行为。请注意,

注意C++是强类型的,不会自动重载<枚举> >运算符< /COD>枚举。code>LeftDockWidgetArea | RightDockWidgetArea需要一个
DockWidgetArea操作符|(DockWidgetArea,DockWidgetArea)
MSalters:enum Foo{Hello};枚举栏{World}。。。INTX=你好|世界;工作很好。以防有人怀疑:MSalters谈论的操作符,可以通过Q_DECLARE_OPERATORS_FOR_FLAGS(MyFlags)轻松声明。所以我添加了名称空间。我必须在名称空间中声明什么才能获得Qt::something?任何东西。在本例中,
enum DockWidgetArea{LeftDockWidgetArea,…}不需要手动创建自定义类。在HCI的答案中,请参阅QQDealReSkyFrase.是的,你是对的,前提是他实际在项目中使用QT库,而不仅仅是试图用自己的代码模拟QT库代码.我确实想用纯C++来模拟它.我编辑了我的问题以包含您的枚举,现在如何使方法类型安全?HWende:对不起。我不是模板之类的专家,所以我不能给出一个可靠的答案。我只是建议您尝试通过引用Qt库的源代码来执行与Qt库中相同的操作。但是,您的解决方案没有Qt标志的标志行为。它解决了一个完全不同的问题。我真的很抱歉。这是我在写国旗问题时犯的错误。我很乐意将解决方案扩展为包含枚举的二进制运算符。(它们的值可以很容易地更改为0x01、0x02、0x04…)但是,如果您想允许MyNames::Field枚举值或其组合,则输入参数类型不能再仅仅是MyNames::Field,即使您可以很容易地重新定义它们的值。例如mc.getField(MyNames::FA | MyNames::FB);如果您只重新定义FA=0x01和FB=0x02,则将失败。如果您知道如何执行此操作,我将很高兴您能在回答中对此进行解释-届时我们可以改进解决方案。
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
};
enum DockWidgetArea {
    LeftDockWidgetArea = 0x1,
    RightDockWidgetArea = 0x2,
    TopDockWidgetArea = 0x4,
    BottomDockWidgetArea = 0x8,

    DockWidgetArea_Mask = 0xf,
    AllDockWidgetAreas = DockWidgetArea_Mask,
    NoDockWidgetArea = 0
};

Q_DECLARE_FLAGS(DockWidgetAreas, DockWidgetArea)