Qtでキーイベントを取るときの注意点

注意点というか、気づいたら当たり前のことなんだけど、ちょっと悩んだのでメモ。


Qtアプリのメインウィンドウでキーイベントを取るとき、例えば次のようにする。


void MainWindow::keyPressEvent(QKeyEvent *event)
{
printf("KEY=%x\n",event->key());

// Homeキーが押されたらアプリ終了
if (event->key() == Qt::Key_Home) {
printf("Quit!\n");
qApp->quit();
}
}
ところが、あるアプリでは上のコードは機能するのに、あるアプリでは機能しないという謎の現象が起こった。問題のアプリでは、Homeキーを押しても keyPressEvent() が呼ばれない。しかし、数字やアルファベットのキーを押したときはkeyPressEvent()が呼ばれる。さらに分からんことに、Homeキーが効かないのはどうやら起動直後だけで、なにかアプリ上のボタンを押した後ならHomeキーが効くのだ。


よく分からんので、起動直後に手当たりしだいキーを押してみた。すると... Endキーを押したとき、アプリ上のスライダが最大値に移動した。そう、問題のアプリでは、初期状態でスライダがフォーカスされていたのだった。スライダはHomeキーが押されると最小値に、Endキーが押されると最大値に移動する。こいつがHomeキーイベントを食ってたわけだ。なんともマヌケな話だ。


というわけで、とりあえずウィジェットのタブオーダーを変えて、起動直後にスライダがフォーカスされないようにした。タブオーダーの設定は下記ページを参考に。QtCreatorのUIデザイナ上部の「タブ順序を編集」ボタンを押して、タブオーダー編集モードにておこなう。
(参考URL) http://labs.qt.nokia.co.jp/2011/05/10/taborder.html


まあ、でもこれは誤魔化しだなあ。スライダがHomeキーイベントを食わないようにしたいのだけど、どうしたものか...