キー入力に反応して動作する機能を実装していたら遭遇したことです。
よく「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文の後ろに何でもいいので処理を追加する
<Category : Qt>
よく「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"); //ここにコレを追加すると正常動作
}
}

