如何在Qml列表视图中更新值?

Nik*_*Nik 1 qt listview qml qtquick2

我有一个ListModel,它存储一个字符串“ cityName”和一个实际值“ TimeZoneOffset”。顾名思义,cityName保存城市名称,TimeZoneOffset保存时间偏移量(距UTC的时间),以分钟为单位。

ListModel {
  id: worldCity

  ListElement {
   cityName: "London"
   TimeZoneOffset: 0
  }

  ListElement {
   cityName: "Amsterdam"
   TimeZoneOffset: 120
  }
}
Run Code Online (Sandbox Code Playgroud)

然后在ListView中使用此模型。ListView具有如下代码示例所示的结构。

ListView {
  model: worldCity
  currentIndex: -1

  delegate: ListItem.Standard {
    text: cityName        
    Label {
      text: timeOffSet + currentSystemTime
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

如您所见,我的ListView显示的是修改后的输出,而不是直接输出listModel元素。我需要每分钟更新一次ListView元素,以显示某个城市的当前时间。我计划使用计时器每分钟更新一次。

如何更新每个listView元素?

The*_*roo 5

对我来说,直接更新模型似乎不是正确的选择,这是代码的简化和增强版本,可以正确执行操作:

import QtQuick 2.0

Rectangle {
    width: 200;
    height: 400;

    property real currentTimestamp;

    function updateTime () {
        var now = new Date ();
        currentTimestamp = now.getTime ();
    }

    Timer {
        interval: 60000;
        repeat: true;
        running: true;
        onTriggered: { updateTime (); }
    }
    ListView {
        anchors.fill: parent;
        model: ListModel {
            ListElement { cityName: "London";     timeOffSet: 0;   }
            ListElement { cityName: "Amsterdam";  timeOffSet: 120; }
            ListElement { cityName: "Paris";      timeOffSet: 60;  }
        }
        delegate: Column {
            anchors {
                left: parent.left;
                right: parent.right;
            }

            Text {
                text: model.cityName;
                font.bold: true;
            }
            Text {
                text: Qt.formatTime (new Date (currentTimestamp + (model.timeOffSet * 60000)), "hh:mm A");
            }
        }
    }
    Component.onCompleted: { updateTime (); }
}
Run Code Online (Sandbox Code Playgroud)