Возможный дубликат:
Как использовать перечисления в качестве флагов в 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 использует аналогичную систему флагов для создания экрана)
Любая помощь с благодарностью.)
Перечислите значения из Вот.
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
Правильно, потому что если вы посмотрите на документация, эти перечисленные значения не являются степенями двух, поэтому вы не можете использовать их как битовые флаги (ну, вы Можно, это просто не будет работать, если какие-либо биты перекрываются).
Вы просто копируете перечисление, определенное в QEvent
так что на самом деле я не вижу смысла вообще. Вам придется проверять каждый тип отдельно, и они не будут вам приходить как комбинация различных значений.