当使用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)
看看定义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.