1

可能重复:
如何在 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);
}

我想做的是说,如果事件类型是“标志”中的以下任何一种,则更新。但是,这是行不通的。更准确地说,它适用于按键,但不适用于鼠标点击或移动事件。

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

4

2 回答 2

2

是的,因为如果您查看文档,这些枚举值并非都是 2 的幂,因此您不能将它们用作位标志(好吧,您可以,如果任何位重叠,它将不起作用)。

您只是在复制 中定义的枚举QEvent,所以我真的完全看不出重点。您必须单独检查每种类型,它们不会作为不同值的组合出现在您面前。

于 2012-09-14T19:19:39.543 回答
2

从这里枚举值。

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

于 2012-09-14T19:22:32.997 回答