2014-04-10 62 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() 

。 。 。

相關問題