我的应用程序的一部分(Weather.qml)当前使用计时器和GPS坐标每5分钟发出一次HTTP GET天气请求。我还有一个用户设置(Settings.qml),允许用户选择一个位置。
我想知道是否可以在修改位置设置时触发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)
}
}
}
答案 0 :(得分:2)
这是不可能的,不需要它。只需在某个属性中的坐标,计时器就可以引用它。您可以直接访问文件范围内的所有内容(代理除外)。
我想知道是否可以在每次触发时触发定时器 位置设置已修改
你可以,但这会失去定时器的目的 - 定时器由一段经过的时间间隔触发。但是,您可以重新启动并触发计时器,然后更改坐标:
property string location : weatherLocation
...
onLocationChanged: timer.restart()
只需修改代码即可location
代替weatherLocation
。您可以通过以下方式更改位置:
onCurrentIndexChanged: location = cbItems.get(currentIndex).coordinates
如果使location
属于主qml组件的属性,则可以从主组件中嵌套(直接或间接)的每个对象直接访问它(除非它被具有相同名称的源本地属性遮蔽)