MacとWindowsでのキーイベントの挙動の違い

KeyPress/KeyReleaseイベントを監視していて、MacWindowsで挙動の違いを見つけたので、メモっておきます。

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 を取得できる方法があったら知りたいです。