为了解释我正在尝试做什么,我正在尝试获取包含更新检查信息的标志整数,例如
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使用类似的标志系统来创建它的屏幕) 非常感谢任何帮助。)
答案 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