EntryNavi : « QML(Qt)でJavaScript(処理)を分離する | メイン | Rewit for Qt ver0.5 更新 »

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

QML(Qt)のキーイベントswitch文の中でデバッグ出力をすると関数呼び出しができない?

キー入力に反応して動作する機能を実装していたら遭遇したことです。
よく「console.debug」を使って意図した動作をしているか確認している原始的な人なのですが・・・。

QMLでは「Keys.onPressed」などでキー入力を取得できるのですが、その中でデバッグ出力をするとその後の関数呼び出しがされなくなるっぽいのです。

と、思ったのですが
実際にはswitch文の中で使用した場合でした。
かつ、caseの中で{}でスコープ?ブロック?を作らない場合に起きるようです。
ブロックを作れば意図通りに動作するようなのですが「新しいスコープを導入しないスコープは避けてください」と警告が出てしまいます。


QMLアプリを作成したときにできるHelloWorldをちょっといじったサンプルで改めて動作を確認したので僕の作ってるプロジェクトだけの問題ではないと思うのですが・・・。
これから調べてみようとは思うのですがなにかご存知の方いたら教えて下さい!

スコープを作成すれば回避できるのは@task_jpさんに教えていただきました。(いつもありがとうございます。)


サンプルは、HelloWorldと表示しているTextにフォーカスを与え「a」が入力されたらMouseAreaの「quit()」関数を、「b」が入力されたら自分の「quit()」関数を呼ぶようにしました。

サンプルは、「a」「b」「左クリック」「右クリック」で、スコープ有り無しを分けてます。
イベントの中とかは関係ないです。
それぞれ「console.debug」があるのでコメントしたり外したりで動作の違いを確認できると思います。

実は、理由があってこおいうものなんでしょうか?



更に追記
教えていただいたのですが、バグレポートに「the JavaScript switch statement embeded in QML can't work correctlly」というのがあり既知でした。
さらに触っていてわかったことですが、デバッグ出力うんぬんは関係なく現状をまとめると。
現象
 ・switch文の2行目以降は実行されない
回避方法(どちらか)
 ・caseとbreakの間を{}で囲ってブロックにする
 ・switch文の後ろに何でもいいので処理を追加する



import QtQuick 1.0

Rectangle {
    width: 360
    height: 360
    MouseArea {
        id: _area
        anchors.fill: parent
        onClicked: {
//            Qt.quit();
        }
        function quit(){
            console.debug("in MouseArea")
            Qt.quit();
        }
    }
    Text {
        focus: true
        anchors.centerIn: parent
        text: "Hello World"

        function quit(){
            console.debug("in Text")
            Qt.quit();
        }

        MouseArea {
            anchors.fill: parent

            acceptedButtons: Qt.LeftButton | Qt.RightButton | Qt.MiddleButton
            onPressed: {
                switch(pressedButtons){
                case Qt.LeftButton:
                {
                    console.debug("click(left) this text ");
                    // ここは正常に関数呼び出しができる
                    _area.quit();
                }
                    break;
                case Qt.RightButton:
                    console.debug("click(right) this text 0");
                    // ↑のデバッグ出力をすると↓の関数呼び出しがされない
                    // console.debugをコメントアウトすると正常に呼び出される
                    _area.quit();
                    break;
                case Qt.MiddleButton:
                    break;
                default:
                    break;
                }
                // console.debug("hoge"); //ここにコレを追加すると正常動作
            }
        }

        Keys.onPressed: {
            switch(event.key){
            case Qt.Key_A:{
                console.debug("input key A");
                // ここは正常に関数呼び出しができる
                _area.quit();
            }
                break;

            case Qt.Key_B:
                console.debug("input key B");
                // ↑のデバッグ出力をすると↓の関数呼び出しがされない
                // console.debugをコメントアウトすると正常に呼び出される
                _area.quit();
                break;

            default:
                break;
            }
        }
        // console.debug("hoge"); //ここにコレを追加すると正常動作
    }
}
<Category : Qt>

検索

Google

サイドフィード

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