一个简单的模型(A simple model)

一个典型的QML C++模型继承自QAbstractListModel ,并且最少需要实现datarowCount函数。在这个例子中我们将使用由QColor类提供的一系列SVG颜色名称并且使用我们的模型展示它们。数据被存储在QList<QString>数据容器中。

我们的DataEntryModel基础自QAbstractListModel并且实现了需要强制实现的函数。我们可以在rowCount中忽略父对象索引,这只在树模型中使用。QModelIndex类提供了视图检索数据需要的单元格行和列的信息,视图基于行列和数据角色从模型中拉取数据。QAbstractListModelQtCore中定义,但是QColor被定义在QtGui中。我们需要附加QtGui依赖。对于QML应用程序,它可以依赖QtGui,但是它通常不依赖QtWidgets

#ifndef DATAENTRYMODEL_H
#define DATAENTRYMODEL_H

#include <QtCore>
#include <QtGui>

class DataEntryModel : public QAbstractListModel
{
    Q_OBJECT
public:
    explicit DataEntryModel(QObject *parent = 0);
    ~DataEntryModel();

public: // QAbstractItemModel interface
    virtual int rowCount(const QModelIndex &parent) const;
    virtual QVariant data(const QModelIndex &index, int role) const;
private:
    QList<QString> m_data;
};

#endif // DATAENTRYMODEL_H

现在你可以使用QML导入命令import org.example 1.0来访问DataEntryModel,和其它QML项使用的方法一样DataEntryModel {}

我们在这个例子中使用它来显示一个简单的颜色条目列表。

import org.example 1.0

ListView {
    id: view
    anchors.fill: parent
    model: DataEntryModel {}
    delegate: ListDelegate {
        // use the defined model role "display"
        text: model.display
    }
    highlight: ListHighlight { }
}

ListDelegate是自定义用来显示文本的代理。ListHighlight是一个矩形框。保持例子的整洁在代码提取时进行了保留。

视图现在可以使用C++模型来显示字符串列表,并且显示模型的属性。它仍然非常简单,但是已经可以在QML中使用。通常数据由外部的模型提供,这里的模型只是扮演了视图的一个接口。