EntryNavi : « Rewit for Qt ver0.3 更新 | メイン | Rewit for Qt ver0.4 更新 »

CategoryNavi : メイン -> コンピューター -> 開発 -> Qt

QML(Qt)でキーイベントの拾い方

QMLでキーイベントを扱い方についてです。

エレメントのfocusプロパティがtrueの時に、「Keys」コンポーネントのイベントハンドラを記述することで扱うことができます。
その際、ざっくり分けて「onPressed」と「onXXXPressed」の2種類のハンドラを使用して処理を追加できます。

 onPressed : ほぼ全て(たぶん)のキーの押下を取得できる。
         イベントはオブジェクト自体にも届く。
 onXXXPressed : 特定のキーのみ実装されている。
           イベントはフックされてオブジェクトへは届かない。


/// 追記 ///
と、思ったのですが。
イベントにはKeyEvent型の引数があります。その中のbool acceptedプロパティの値でイベントが親に到達するかどうかが決まります。
この値をイベントの中で変更するとそれ以降の動作を切り替えれます。
デフォルトがそれぞれ(デフォルト)
onPressed : false
onXXXPressed : true
に、なっていますので動作に違いがでています。
これを制御すればonPressedでもonXXXPressedでもどっちでもOKな話になります。

なので、以下デフォルト動作での話になります。
(ソースも少し修正しました。)

というか、基本的にonXXXPressedの方はイベントをオブジェクトに伝えたくないキーの分が実装されていると思いますのでそおいった目的で使うのがよいのかなと。
(いつもどおり指摘をいただきましたありがとうございます。)
/// 追記終わり ///


ボタンやエリアのように文字を入力しない場合はどちらを使っても特に問題にならないと思います。
可読性など処理の内容によって選んでも良いのかもしれません。

逆に、TextEditのように文字を入力する場合は注意が必要です。
上記の通り、ハンドラを仕掛けたオブジェクト自体にイベントが届くのと届かないのでは大きな違いがあります。
「Enter」キーを押した時の動作の違いを簡単にまとめると
 onPressed : イベントを取得できて、改行が入力される
 onXXXPressed : イベントを取得できて、改行は入力されない

例えば
 ・ツイッタークライアントでエンターが押されたら投稿をしたい場合は、onXXXPressedを使用します。
 ・タブキーを押されたらフォーカスを移動させたい場合も、onXXXPressedを使用します。
 ・改行は入力するけど裏でなにか処理をする場合は、onPressedを使用します。
 ・文字などの入力され具合は気にせず特定の処理をする場合は、onPressedを使用します。




実際にTextEditエレメントにキーイベントを配置して入力状況をデバッグコンソールへ出力するサンプルです。
どんな感じに入力されるか確かめてみてください。

import QtQuick 1.0

Rectangle {
    id: _root
    width: 512
    height: 360

    TextEdit{
        id: _text
        width: 100
        height: 20
        x: 0
        y: 10

        focus: true

        // スペースキー
        Keys.onSpacePressed: {
            console.debug("<direct> Key=" + event.key + ",text=[Space],accepted=" + event.accepted);
            // これでイベントが到達する
            //event.accepted = false;
        }

        // キー入力
        Keys.onPressed: {
            switch(event.key){
            case Qt.Key_Home:
                console.debug("Key=" + event.key + ",text=[Home],accepted=" + event.accepted);
                break;
            case Qt.Key_End:
                console.debug("Key=" + event.key + ",text=[End],accepted=" + event.accepted);
                break;
            case Qt.Key_Space:
                console.debug("Key=" + event.key + ",text=[Space],accepted=" + event.accepted);
                break;
            default:
                console.debug("Key=" + event.key + ",text=" + event.text + ",accepted=" + event.accepted);
                break;
            }
            // これでイベントが到達しなくなる
            //event.accepted = true;
        }
    }
}

//
// 「a」「b」「c」「space」「Home」「End」「a」「b」「c」と
// 入力した時のログ
// -- start log --
// Key=65,text=a
// Key=66,text=b
// Key=67,text=c
//  Key=32,text=[Space]
// Key=16777232,text=[Home]
// Key=16777233,text=[End]
// Key=65,text=a
// Key=66,text=b
// Key=67,text=c



<Category : Qt>

検索

Google

サイドフィード

track feed 理ろぐ
人気ブログランキング - 理ろぐ
Powered by
Movable Type 3.34