MacとWindowsでのキーイベントの挙動の違い
KeyPress/KeyReleaseイベントを監視していて、MacとWindowsで挙動の違いを見つけたので、メモっておきます。
bool MainWindow::event( QEvent *event ) { if (event->type() == QEvent::KeyPress) { QKeyEvent *ke = static_cast<QKeyEvent *>(event); QString s = tr("KeyPress: ") + QString::number( (int)ke->key()); デバッグ出力( s ); } if (event->type() == QEvent::KeyRelease) { QKeyEvent *ke = static_cast<QKeyEvent *>(event); QString s = tr("KeyRelease: ") + QString::number( (int)ke->key()); デバッグ出力( s ); }
例えばこんな感じで event をハンドルした際に、QActionのショートカットに「Ctrl(Command) + Z」が割り当てられていると、
- Windowsの場合
- Ctrlを押す : KeyPress (Ctrl) が発行される
- Zを押す : 何も発行されない
- Zを離す : KeyRelease (Z) が発行される
- Ctrlを離す : KeyRelease (Ctrl) が発行される
- Macの場合
- Commandを押す : KeyPress (Command) が発行される
- Zを押す : 何も発行されない
- Zを離す : 何も発行されない
- Commandを離す : KeyRelease (Command) が発行される
となります。もしも「Ctrl(Command) + Z」に何もショートカットが割り当てられてないと、
- Windowsの場合
- Ctrlを押す : KeyPress (Ctrl) が発行される
- Zを押す : KeyPress (Z) が発行される
- Zを離す : KeyRelease (Z) が発行される
- Ctrlを離す : KeyRelease (Ctrl) が発行される
- Macの場合
- Commandを押す : KeyPress (Command) が発行される
- Zを押す : KeyPress (Z) が発行される
- Zを離す : 何も発行されない
- Commandを離す : KeyRelease (Command) が発行される
となるのを確認しました。ショートカットが割り当てられていたり、Ctrl(Command) キーが絡んでいる時の挙動は不定、って事ですかね…(涙)。いつでも必ず KeyPress/KeyRelease を取得できる方法があったら知りたいです。