よく「console.debug」を使って意図した動作をしているか確認している原始的な人なのですが・・・。
と、思ったのですが
実際にはswitch文の中で使用した場合でした。
かつ、caseの中で{}でスコープ?ブロック?を作らない場合に起きるようです。
ブロックを作れば意図通りに動作するようなのですが「新しいスコープを導入しないスコープは避けてください」と警告が出てしまいます。
QMLアプリを作成したときにできるHelloWorldをちょっといじったサンプルで改めて動作を確認したので僕の作ってるプロジェクトだけの問題ではないと思うのですが・・・。
これから調べてみようとは思うのですがなにかご存知の方いたら教えて下さい!
スコープを作成すれば回避できるのは@task_jpさんに教えていただきました。(いつもありがとうございます。)
サンプルは、「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"); //ここにコレを追加すると正常動作 } }
コメント