2014-04-10 32 views
1

我见过其他人使用“onSourceChanged:reload();”信号在XmlListModel中,但我找不到任何有关它的信息(并且它不适合我)。 xml文件更新快(每秒1或2次)。 我也尝试过用我自己的xml文件并手动编辑它,但没有成功。如何在间隔或数据更改时从XmlListModel中刷新数据?

如何更新ListView/XmlListModel,以便我的应用程序始终显示正确的数据? (这是在间隔时间或来源改变时)。

我XmlListModel文件(ICDModel.qml)

import QtQuick 2.0 
import QtQuick.XmlListModel 2.0 

XmlListModel { 

    source: "http://192.168.1.103:89/FunctionGenerator/FuncGen1.xml" 
    query: "/Component/Signals/Signal" 

    onSourceChanged: reload(); 

    XmlRole { name: "Name"; query: "@Name/string()" } 
    XmlRole { name: "Description"; query: "@Description/string()" } 
    XmlRole { name: "Value"; query: "@Value/string()"; isKey: true } 
} 

内main.qml

ListView { 
    id: listView 
    anchors.fill: parent 
    spacing: 10 
    model: ICDModel2 {} 
    delegate: contactDelegate 
    highlight: highlightBar 
    highlightFollowsCurrentItem: false 
    focus: true 
} 

最后委托(也在里面main.qml)ListView控件

Component { 
     id: contactDelegate 
     Item { 
      id: wrapper 
      height: 40; width: parent.width 
      Column { 
       Text { text: '<b>Name:</b> ' + Name } 
       Text { text: '<b>Description:</b> ' + Description } 
       Text { text: '<b>Value:</b> ' + Value } 

      } 
      states: State { 
       name: "Current" 
       when: wrapper.ListView.isCurrentItem 
       PropertyChanges { target: wrapper; x: 20 } 
      } 
      transitions: Transition { 
       NumberAnimation { properties: "x"; duration: 200 } 
      } 
      MouseArea { 
       id: mouse_area1 
       anchors.fill: parent 
       hoverEnabled: false 
       onClicked: { 
        wrapper.ListView.view.currentIndex = index 
      } 
     } 
    } 
} 
+0

你在哪里改变源代码?我只看到一个静态源,所以“onSourceChanged”信号不会被调用!? – Xander

+0

你是对的@Xander。不能相信我没有意识到“onSourceChanged”只在实际的源URL更改时被调用,而不是从源收集的值。 (愚蠢的错误)。一位朋友找到了解决方案,所以我应该以某种方式解决这个问题。谢谢! – user2750342

+2

你可以回答你自己的问题,并接受它作为答案(如果别人有类似的问题)。 :) – Xander

回答

0

由于这个问题花了我相当长的时间来解决这个问题,原来的海报并没有打算提供他的解决方案,我会展示h我可以解决这个问题:

我给我的源添加了一个随机属性,并使用定时器在给定的时间间隔内重新加载XmlListModel。

Timer { 
    id: xmlContentReloader 
    repeat: true 
    interval: 1000 * 60 // Check once a minute 
    onTriggered: { 
     xmlModel.source = "http://<host>/servermessage.xml?requestid=" + Math.random() * 9999 
     xmlModel.reload() 
    } 

}

XmlListModel { ID:xmlModel

source: { 

     return "http://<host>/servermessage.xml?requestid=" + Math.random() * 9999 
    } 
    query: "/item" 

    XmlRole { name: "storeVersion"; query: "CurrentVersion/string()" } 
    XmlRole { name: "motd"; query: qsTr("en-US") + "/string()" } 

    onStatusChanged: { 

    if (status == XmlListModel.Ready) { 

     var storeName = "" 
     if (!xmlContentReloader.running) xmlContentReloader.start() 

。 。 。

相关问题