在C ++中使用枚举标志

时间:2012-09-14 19:13:56

标签: c++ qt enumeration flags

  

可能重复:
  How to use enums as flags in C++?

为了解释我正在尝试做什么,我正在尝试获取包含更新检查信息的标志整数,例如

int flags = keyPress | mouseClick | mouseMove; 

来自我的事件;

enum mEvents {
     keyPress = QEvent::KeyPress,
     keyRelease = QEvent::KeyRelease,
     mouseClick = QEvent::MouseButtonPress,
     mouseDoubleClick = QEvent::MouseButtonDblClick,
     mouseMove = QEvent::MouseMove
};

这样我就可以检查发生了什么类型的事件;

void Lib::Update(QEvent *e) {
     if (e->type() == flags)
         stateManager->updateCurrentState(e);
}

我想要做的是,如果事件类型是'flags'中的以下任何一种,那么更新。但是,这是行不通的。更确切地说,它适用于按键操作,但不适用于鼠标点击或移动事件。

所以我想知道,如果我想做的事情是可能的,如果可以的话,我怎么能实现这个目标呢? (我很确定它是,我知道SDL使用类似的标志系统来创建它的屏幕) 非常感谢任何帮助。)

2 个答案:

答案 0 :(得分:2)

是的,因为如果你查看the documentation,那些枚举值并非都是2的幂,所以你不能将它们用作位标志(好吧,你可以,它如果任何位重叠,则无法工作。

你只是复制QEvent中定义的枚举,所以我根本没有看到这一点。你必须单独检查每种类型,它们不会作为不同值的组合来找你。

答案 1 :(得分:2)

来自here的枚举值。

QEvent::KeyPress = 6 = 0x0110

QEvent::KeyRelease = 7 = 0x0111

QEvent::NonClientAreaMouseButtonPress = 174 = 0x10101110

QEvent::MouseButtonDblClick = 4 = 0x0100

QEvent::MouseMove = 5 = 0x0101

注意这些如何按位排列:

0x00000110

0x00000111

0x10101110

0x00000100

0x00000101

为了使其工作,所有的标志都必须至少有一个不被其他标志共享的位。注意

0x10101110 | 0x00000110 = 0x10101110这是第一个标志。

这样:

QEvent::NonClientAreaMouseButtonPress | QEvent::KeyPress

与简单无法区分:

QEvent::NonClientAreaMouseButtonPress