3

文字列「cityName」と実際の値「TimeZoneOffset」を格納する ListModel があります。名前が示すように、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 側に保持することを好みます。したがって、すべてのプロキシモデルを使用することが可能です。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 に答える