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

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

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

  1. #ifndef DATAENTRYMODEL_H
  2. #define DATAENTRYMODEL_H
  3. #include <QtCore>
  4. #include <QtGui>
  5. class DataEntryModel : public QAbstractListModel
  6. {
  7. Q_OBJECT
  8. public:
  9. explicit DataEntryModel(QObject *parent = 0);
  10. ~DataEntryModel();
  11. public: // QAbstractItemModel interface
  12. virtual int rowCount(const QModelIndex &parent) const;
  13. virtual QVariant data(const QModelIndex &index, int role) const;
  14. private:
  15. QList<QString> m_data;
  16. };
  17. #endif // DATAENTRYMODEL_H

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

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

  1. import org.example 1.0
  2. ListView {
  3. id: view
  4. anchors.fill: parent
  5. model: DataEntryModel {}
  6. delegate: ListDelegate {
  7. // use the defined model role "display"
  8. text: model.display
  9. }
  10. highlight: ListHighlight { }
  11. }

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

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