3

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

ListModel {
  id: worldCity

  ListElement {
   cityName: "London"
   TimeZoneOffset: 0
  }

  ListElement {
   cityName: "Amsterdam"
   TimeZoneOffset: 120
  }
}

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

ListView {
  model: worldCity
  currentIndex: -1

  delegate: ListItem.Standard {
    text: cityName        
    Label {
      text: timeOffSet + currentSystemTime
    }
  }
}

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

如何更新每个 listView 元素?

4

4 回答 4

6

对我来说,直接更新模型似乎不是正确的选择,这是您的代码的简化和增强版本,它可以正确地做事:

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 (); }
}
于 2013-06-14T07:41:12.900 回答
0

QML ListModel 对于脚本编写非常无文档,但查看它的源代码,可以知道哪些方法可用于迭代。

例如,如果您使用一些 JSON api 并且需要内联更新对象,或者如果您无法直接访问,ListElement那么您可以通过脚本从模型中访问这些方法:

Q_INVOKABLE void clear();
Q_INVOKABLE void remove(int index);
Q_INVOKABLE void append(const QScriptValue&);
Q_INVOKABLE void insert(int index, const QScriptValue&);
Q_INVOKABLE QScriptValue get(int index) const;
Q_INVOKABLE void set(int index, const QScriptValue&);
Q_INVOKABLE void setProperty(int index, const QString& property, const QVariant& value);
Q_INVOKABLE void move(int from, int to, int count);
Q_INVOKABLE void sync();
于 2015-06-14T15:25:03.233 回答
0

我更喜欢将模型保留在 C++、Qt 端。所以可以使用所有 proxymodel 的东西。在 Qt 上,您必须将 C++ 对象 m_pMyModel 设置为 QML 世界的属性:

m_pQuickView->rootContext()->setContextProperty("_myModel", m_pMyModel);

并在 QML 中直接使用它:

    ListView {
            id: listView
            model : _myModel
            delegate : myDelegate
            ....
   }

为了能够在 QML 委托中使用数据,您必须创建一个 roleNames 哈希:

 QHash<int, QByteArray> MyModel::roleNames() const
  {
    QHash<int, QByteArray> roles;
    roles[NameRole] = "name_role";
    roles[IconRole] = "icon_role";
    roles[StateRole] = "state_role";
    roles[TypeRole] = "type_role";
    return roles;
}
于 2016-07-12T14:18:14.943 回答
0
ListModel {
    id: fruitModel

    ListElement {
        name: "Apple"
        cost: 2.45
        attributes: [
            ListElement { description: "Core" },
            ListElement { description: "Deciduous" }
        ]
    }
    ListElement {
        name: "Orange"
        cost: 3.25
        attributes: [
            ListElement { description: "Citrus" }
        ]
    }
    ListElement {
        name: "Banana"
        cost: 1.95
        attributes: [
            ListElement { description: "Tropical" },
            ListElement { description: "Seedless" }
        ]
    }
}

现在可以更改

console.log(fruitModel.get(1).cost);
fruitModel.get(1).cost = 10.95;
console.log(fruitModel.get(1).cost);

qml: 3.25

qml: 10.95

或者

fruitModel.setProperty(1, "cost", 10.95)

或者

fruitModel.set(1, {"cost": 10.95})
于 2021-12-17T19:38:22.920 回答