qt — Использование флагов enum в переполнении стека

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

1

Решение

Перечислите значения из Вот.

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

2

Другие решения

Правильно, потому что если вы посмотрите на документация, эти перечисленные значения не являются степенями двух, поэтому вы не можете использовать их как битовые флаги (ну, вы Можно, это просто не будет работать, если какие-либо биты перекрываются).

Вы просто копируете перечисление, определенное в QEventтак что на самом деле я не вижу смысла вообще. Вам придется проверять каждый тип отдельно, и они не будут вам приходить как комбинация различных значений.

2

По вопросам рекламы [email protected]