一个简单的模型(A simple model)
一个典型的QML C++模型继承自QAbstractListModel
,并且最少需要实现data
和rowCount
函数。在这个例子中我们将使用由QColor
类提供的一系列SVG颜色名称并且使用我们的模型展示它们。数据被存储在QList<QString>
数据容器中。
我们的DataEntryModel
基础自QAbstractListModel
并且实现了需要强制实现的函数。我们可以在rowCount
中忽略父对象索引,这只在树模型中使用。QModelIndex
类提供了视图检索数据需要的单元格行和列的信息,视图基于行列和数据角色从模型中拉取数据。QAbstractListModel
在QtCore
中定义,但是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中使用。通常数据由外部的模型提供,这里的模型只是扮演了视图的一个接口。