C

Qt Quick Ultralite 列表模型示例

演示了如何创建可变列表模型。

概述

本例展示了如何使用 Qul::ListModel 创建可变模型。该模型在 ListView 中使用,以构建一个最小的闹钟应用程序。

本例显示了一个可以暂停、继续和删除的闹钟列表。每次点击“创建新闹钟”按钮都会添加一个新的闹钟。

目标平台

项目结构

列表模型

文件 mylistmodel.h 定义了列表模型。

首先,它声明列表元素的类型数据

// To create a custom ListModel<T>, we need to declare a type T that holds
// the data for each element and is equality comparable.
//
// Here, the data type is AlarmData and it holds the number of seconds before
// the alarm should trigger (negative if it has already triggered), as well
// as a running flag.
//! [ListModel data]
struct AlarmData
{
    AlarmData()
        : seconds(0)
        , running(false)
    {}

    AlarmData(int argSeconds, bool argRunning)
        : seconds(argSeconds)
        , running(argRunning)
    {}

    int seconds;
    bool running;
};

inline bool operator==(const AlarmData &lhs, const AlarmData &rhs)
{
    return lhs.seconds == rhs.seconds && lhs.running == rhs.running;
}

然后基于 ListModel<AlarmData>

// Declare our AlarmModel.
//
// The only requirement is that we implement the pure virtual functions
// count() and data() from ListModel.
//
// We add the other functions to allow our UI to affect the model.
//! [custom ListModel]
struct AlarmModel : Qul::ListModel<AlarmData>
{
private:
    std::vector<AlarmData, Qul::PlatformInterface::Allocator<AlarmData> > m_data;

public:
    // Implement the ListModel interface
    int count() const QUL_DECL_OVERRIDE { return m_data.size(); }
    AlarmData data(int index) const QUL_DECL_OVERRIDE { return m_data[index]; }

模型还包含从 QML 修改模型的功能,如 addEntry() 函数。

    void addEntry(int seconds)
    {
        m_data.push_back(AlarmData(seconds, true));
        modelReset();
    }
列表视图

listmodel.qml 中的 ListView 需要一个 AlarmModel,它作为根对象的子元素创建

    // Create an instance of the custom AlarmModel
    AlarmModel {
        id: alarmModel
    }

ListView 使用模型实例来填充数据到 alarmDelegate

    // This ListView is the main display element. It creates an alarmDelegate
    // instance for each entry in alarmModel and listens to alarmModel changes.
    ListView {
        width: parent.width
        anchors.top: parent.top
        anchors.bottom: controls.top

        model: alarmModel
        delegate: alarmDelegate
    }

当单击“创建新闹钟”按钮时,会调用模型上的一个函数来添加一个新的闹钟

        Button {
            id: createNewButton
            text: "Create new"
            anchors.right: parent.right
            onClicked: alarmModel.addEntry(15)
        }
代理

代理根据模型的数据控制 ListView 中每个条目的外观和感觉。

    // Declare the delegate that the ListView (below) instantiates for each
    // entry in the alarm model.
    //
    // It shows information about the entry and two buttons, one to pause or
    // unpause the alarm, and one to remove it from the list.
    Component {
        id: alarmDelegate

        Item {
            width: root.width
            height: 60

例如,每个闹钟上按钮的状态和标签定义如下

            Row {
                anchors.right: parent.right
                Button {
                    text: model.running ? "Pause" : "Unpause"
                    visible: model.seconds > 0
                    // The "index" property contains the model index for
                    // the current delegate instance.
                    onClicked: alarmModel.togglePause(index)
                }
                Button {
                    text: "Remove"
                    onClicked: alarmModel.remove(index)
                }
            }

文件

参见 Qul::ListModelListView

在特定 Qt 许可下可用。
了解更多信息。