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

これが機能するためには、すべてのフラグが他のフラグによって共有されていない少なくとも1つのビットを持っている必要があります。注意してください

0x10101110 | 0x00000110=0x10101110これはそれ自体が最初のフラグです。

それで:

QEvent::NonClientAreaMouseButtonPress | QEvent::KeyPress

単純なものと見分けがつかない:

QEvent::NonClientAreaMouseButtonPress

于 2012-09-14T19:22:32.997 に答える