また基本的な動作は以前の記事の「QML(Qt)でキーイベントの拾い方」のとおりです。
ただ、気になる点があります。
/// 気になる点 ///
・ハードキーは拾えるものと拾えないものがある。
・戻るキーをブロックして任意の動作をさせれない。
(ユーザーに押下されると必ずアクティビティが閉じてしまう。)
・文字のハードキーとメニューなどの機能系のハードキーで動作が違うかも?
(エミュレータでしか確認できてないですが)
本当は、戻るキーのイベントを拾ってメニューを消すとかの処理をしてaccepted=trueってしてアクティビティを閉じるのを阻止したかったのです。
イベントが拾えたとしてもacceptedの指定で阻止できるか不明です。
Ministro2のソース見て確認しようと思ったらsource forgeに肝心なところがないんですよね。 GPLなので言えば見せてくれると思うのですが。
/// 動作検証結果 ///
・トップのRectangle(など)に「focus:true」とする。
→キーイベントは拾えない。
通常はこれでOKのはず。
Aキーを押した時のログ
D/Qt (25598): keyDown
D/Qt (25598): keyUp
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
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
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
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();
}
}
コメント