QML(Qt for Android)でのキーイベントについて

基本的には「QML Keys Element」を使用すれば可能です。
また基本的な動作は以前の記事の「QML(Qt)でキーイベントの拾い方」のとおりです。

ただ、気になる点があります。

/// 気になる点 ///
・ハードキーは拾えるものと拾えないものがある。
・戻るキーをブロックして任意の動作をさせれない。
 (ユーザーに押下されると必ずアクティビティが閉じてしまう。)
・文字のハードキーとメニューなどの機能系のハードキーで動作が違うかも?
 (エミュレータでしか確認できてないですが)

本当は、戻るキーのイベントを拾ってメニューを消すとかの処理をしてaccepted=trueってしてアクティビティを閉じるのを阻止したかったのです。
イベントが拾えたとしてもacceptedの指定で阻止できるか不明です。
Ministro2のソース見て確認しようと思ったらsource forgeに肝心なところがないんですよね。 GPLなので言えば見せてくれると思うのですが。


/// 動作検証結果 ///

・トップのRectangle(など)に「focus:true」とする。
 →キーイベントは拾えない。
  通常はこれでOKのはず。
Aキーを押した時のログ
D/Qt (25598): keyDown
D/Qt (25598): keyUp


・何かのタイミングで、「forceActiveFocus()」を実行する。
 →キーイベントが拾えるようになる。
  ただし、トップのRectanbleのonCompletedで実行しても効果なし。
  別のタイミングで実行する必要がある。
Aキーを押した時のログ
D/Qt (25598): keyDown
D/Qt (25598): rect down key=65
D/Qt (25598): keyUp
D/Qt (25598): rect up key=65


・TextInputエレメントなどにフォーカスを当てる。
 →TextInput側ではpress/releaseの両方にイベント起きるが
  トップのRectangle側にはreleaseしかこない。
  (この動作に関してはエミュレータでのみの確認です。)
Aキーを押した時のログ
D/Qt (25598): keyDown
D/Qt (25598): input down key=65
D/Qt (25598): keyUp
D/Qt (25598): input up key=65
D/Qt (25598): rect up key=65


・メニューなどのハードキーを押した場合(かつTextInputにフォーカス)
 →TextInput/Rectangleのどちらにもpress/releaseの両方にイベントが起きる。
  ただイベントが拾えるのは後述のキーコードが解っているものだけ。
Menuキーを押した時のログ
D/Qt (27992): keyDown
D/Qt (27992): input down key=16777301
D/Qt (27992): rect down key=16777301
D/Qt (27992): keyUp
D/Qt (27992): input up key=16777301
D/Qt (27992): rect up key=16777301


補足
 TextInputにフォーカスがある時の動作ですが、イベントの中で以下のように「KeyEvent.accepted」をtrueにすると親のRectangleへイベントは飛ばなくなります。
event.accepted = true;


/// ハードキーのコード ///
・ホーム : ?
・メニュー : 16777301
・戻る : ?
・検索 : 16777362
・カメラ : ?
・ボリュームダウン : 16777328
・ボリュームアップ : 16777330
・電源 : ?
・受話 : 17825796
・終話 : ?
?のキーは拾えませんでした。

検証コード
import QtQuick 1.0
//import "./Database.js" as DB

Rectangle {
    id: _root
    width: 360
    height: 360
    focus: true

    Text {
        id: _text
        text: qsTr("code1=")
        anchors.centerIn: parent
    }
    Text {
        id: _text2
        text: qsTr("code2=")
        anchors.top: _text.bottom
        anchors.topMargin: 10
        anchors.horizontalCenter: parent.horizontalCenter
    }
    MouseArea {
        anchors.fill: parent
        onClicked: {
            // これは効果あり
            _root.forceActiveFocus();
        }
    }

    TextInput{
        id: _input
        anchors.top: _text2.bottom
        anchors.topMargin: 10
        anchors.horizontalCenter: parent.horizontalCenter
        width: 200
        height: 50
        text: "default"

        // TextInputのキーイベント
        Keys.onPressed: {
            console.debug("input down key=" + event.key + ",accept=" + event.accepted);
            // event.accepted = true; //これを実行するとrectへイベントはいかない
        }
        Keys.onReleased: {
            console.debug("input up   key=" + event.key + ",accept=" + event.accepted);
            _text2.text = "code2=" + event.key;
            // event.accepted = true; //これを実行するとrectへイベントはいかない
        }
    }

    // ルートのRectangleのキーイベント
    Keys.onPressed: {
        console.debug("rect  down key=" + event.key + ",accept=" + event.accepted);
    }
    Keys.onReleased: {
        console.debug("rect  up   key=" + event.key + ",accept=" + event.accepted);
        _text.text = "code1=" + event.key;
    }

    // 読み込み完了時
    Component.onCompleted: {
        // これは効果無し
        _root.forceActiveFocus();
    }
}