2016-10-10 28 views
0

私のアプリケーション(Weather.qml)の一部は、現在、タイマーとGPS座標を使用して5分ごとに天気のHTTP GET要求を行います。また、ユーザーが場所を選択できるようにするユーザー設定(Settings.qml)もあります。Qt - タイマを早期に起動し、引数をタイマに渡す方法はありますか?

場所の設定が変更されたときにTimerをトリガーし、Timerが新しい座標を取得してHTTP Get要求に渡すことができるかどうかは疑問でした。

現時点では、起動時に実行可能ファイルにGPS座標を引数(weatherLocation)として渡しています。

Weather.qml

WeatherForm { 

    // A timer to refresh the forecast every 5 minutes 
    Timer { 
     interval: 300000 
     repeat: true 
     triggeredOnStart: true 
     running: true 
     onTriggered: { 
      if (weatherAppKey != "" && weatherLocation != "") { 
       // Make HTTP GET request and parse the result 
       var xhr = new XMLHttpRequest; 
       xhr.open("GET", 
         "https://api.darksky.net/forecast/" 
         + weatherAppKey + "/" 
         + weatherLocation 
         + "?exclude=[minutely,hourly,daily,alerts,flags]" 
         + "&units=auto"); 
       xhr.onreadystatechange = function() { 
        if (xhr.readyState == XMLHttpRequest.DONE) { 
         var a = JSON.parse(xhr.responseText); 
         parseWeatherData(a); 
        } 
       } 
       xhr.send(); 
      } else { 

       ... 

      } 
     } 
    } 

    ... 

} 

Settings.qml

SettingsForm { 

    Rectangle { 

     ... 

     ComboBox { 
      id: cityComboBox 
      anchors.right: parent.right 
      anchors.verticalCenter: parent.Center 
      model: ListModel { 
       id: cbItems 
       ListElement { city: "Vancouver"; coordinates: "49.2666,-123.1976" } 
       ListElement { city: "New York"; coordinates: "40.7306,-73.9866" } 
       ListElement { city: "Hong Kong"; coordinates: "22.2793,114.1628" } 
      } 
      textRole: 'city' 

      // Trigger the Timer here possibly 
      onCurrentIndexChanged: console.debug(cbItems.get(currentIndex).city) 
     } 
    } 
} 

答えて

2

それは不可能であり、それは必要ありません。タイマーがそれを参照できるどこかのプロパティの座標を取得するだけです。ファイルのスコープ内にあるすべてのものに直接アクセスできます(デリゲートを除く)。

タイマーをトリガーすることが可能であった場合 場所の設定が

を変更された時はいつでも私は、あなたは可能性が思っていたが、それは、タイマーを持つことの目的に反し - タイマーが経過によってトリガされます時間間隔。あなたが再起動し、タイマーを引き起こす可能性が、その後の座標は変更:

property string location : weatherLocation 
... 
onLocationChanged: timer.restart() 

ちょうどweatherLocationの代わりにlocationを使用するためにコードを変更します。あなたはlocationメインQMLコンポーネントのプロパティを作成する場合は

onCurrentIndexChanged: location = cbItems.get(currentIndex).coordinates 

は、それはそれはの陰にされない限り(主成分に(直接または間接的に)ネストされたすべてのオブジェクトから直接アクセスできるようになります:あなたがして場所を変更することができます同じ名前のソースローカルプロパティ)。

+0

ありがとうございます。私は間違った方向にも問題に取り組んでいることに気付きました。私は、HTTP.GETコードをWeather.qmlの独自の関数に分離し、Connectionsを使用してSettings.qmlから関数を呼び出すことになりました。私の主なQMLコンポーネントに 'location'変数を置くことはもっときれいかもしれませんが、私はそれについても見ていきます。 – CudB

関連する問題