Qt - 有没有办法提前触发Timer并将参数传递给Timer

时间:2016-10-10 19:54:04

标签: qt qml qtquick2

我的应用程序的一部分(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)  
        }
    }
}

1 个答案:

答案 0 :(得分:2)

这是不可能的,不需要它。只需在某个属性中的坐标,计时器就可以引用它。您可以直接访问文件范围内的所有内容(代理除外)。

  

我想知道是否可以在每次触发时触发定时器   位置设置已修改

你可以,但这会失去定时器的目的 - 定时器由一段经过的时间间隔触发。但是,您可以重新启动并触发计时器,然后更改坐标:

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

只需修改代码即可location代替weatherLocation。您可以通过以下方式更改位置:

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

如果使location属于主qml组件的属性,则可以从主组件中嵌套(直接或间接)的每个对象直接访问它(除非它被具有相同名称的源本地属性遮蔽)