请详细讲解QAbstractItemModel和qml listview的配合用法,特别是两者是怎么建立联系的
时间: 2024-05-03 16:22:59 浏览: 217
QAbstractItemModel和qml listview是Qt中常用的两个类,用于在界面中展示列表数据。下面是它们的配合用法:
1. 创建QAbstractItemModel子类
QAbstractItemModel是一个抽象基类,需要自己实现一些虚函数来实现自己的数据模型。比如我们可以创建一个MyModel类来继承QAbstractItemModel,并实现一些虚函数,如下所示:
```
class MyModel : public QAbstractItemModel
{
Q_OBJECT
public:
explicit MyModel(QObject *parent = nullptr);
~MyModel();
QModelIndex index(int row, int column, const QModelIndex &parent = QModelIndex()) const override;
QModelIndex parent(const QModelIndex &child) const override;
int rowCount(const QModelIndex &parent = QModelIndex()) const override;
int columnCount(const QModelIndex &parent = QModelIndex()) const override;
QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
QHash<int, QByteArray> roleNames() const override;
private:
QList<QString> m_dataList;
};
```
上面的代码实现了QAbstractItemModel的一些虚函数,其中m_dataList是用来存储数据的列表。
2. 实现roleNames函数
在上面的代码中,我们还实现了一个roleNames函数。它的作用是将我们自定义的角色名称与Qt内置的角色值进行映射,以方便在qml中使用。比如我们可以定义一个名为“mydata”的角色,像这样:
```
QHash<int, QByteArray> MyModel::roleNames() const
{
QHash<int, QByteArray> roles;
roles[Qt::DisplayRole] = "display";
roles[Qt::UserRole + 1] = "mydata"; // 自定义角色
return roles;
}
```
上面的代码中,我们将自定义角色“mydata”的值定义为Qt::UserRole + 1,这个值是Qt内置的,用于表示用户自定义的角色。
3. 实现data函数
在MyModel类中,还需要实现data函数。这个函数用于返回给定索引处的数据。在这个函数中,我们需要根据不同的角色返回不同的数据。比如我们可以这样实现:
```
QVariant MyModel::data(const QModelIndex &index, int role) const
{
if (!index.isValid())
return QVariant();
if (role == Qt::DisplayRole)
return m_dataList.at(index.row());
else if (role == Qt::UserRole + 1) // 自定义角色
return m_dataList.at(index.row()) + " custom data"; // 返回自定义数据
return QVariant();
}
```
上面的代码中,我们返回了两种角色的数据,一种是Qt::DisplayRole,它用于显示数据;另一种是我们自定义的角色“mydata”,它返回一个自定义的字符串。
4. 在qml中使用listview
在qml中,我们可以使用ListView来展示数据。使用ListView需要设置model属性,将之前创建的MyModel对象传入。我们还可以设置delegate属性,来自定义每个列表项的显示方式。比如我们可以这样实现:
```
ListView {
width: 200
height: 200
model: MyModel {}
delegate: Text {
text: display
font.bold: true
font.pointSize: 16
color: "blue"
}
}
```
上面的代码中,我们将MyModel对象传入model属性中。在delegate属性中,我们使用了一个Text组件来显示每个列表项的数据,其中“display”是Qt内置的角色值,用于显示数据。
5. 在qml中访问自定义角色
如果我们想在qml中访问自定义角色“mydata”,可以使用model对象的get函数,它接受两个参数,一个是索引,另一个是角色名称。比如我们可以这样访问:
```
Text {
text: model.get(index, "mydata")
}
```
上面的代码中,我们使用了一个Text组件,通过get函数获取自定义角色“mydata”的值,并将其作为文本内容显示出来。
总结:
QAbstractItemModel和qml listview的配合使用,可以实现在qml中展示列表数据。我们需要自己实现一个QAbstractItemModel子类,并在qml中将其作为ListView的model属性,再通过model对象的get函数来访问自定义的角色。
阅读全文