赞
踩
QAbstractListModel类提供了一个抽象模型,可以子类化它来创建一维列表模型。
以下示例实现一个最简单的ListModel,需要重写以下几个方法。
- #ifndef MYLISTMODEL_H
- #define MYLISTMODEL_H
-
- #include <QAbstractListModel>
- #include <QList>
-
- //自定义抽象数据类型
- class Data
- {
- public:
- Data(const QString &name, int value) : m_name(name),m_value(value){
-
- };
- QString m_name;
- qint32 m_value;
- };
-
- class MyListModel : public QAbstractListModel
- {
- Q_OBJECT
-
- public:
- enum RoleNames{
- Name = Qt::DisplayRole+1,
- Value
- };
-
- // Basic functionality:
- int rowCount(const QModelIndex &parent = QModelIndex()) const override;
-
- QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
-
- virtual QHash<int, QByteArray> roleNames() const override;
-
- explicit MyListModel(QObject *parent = nullptr);
-
- private:
- QList<Data> m_data;
- };
-
- #endif // MYLISTMODEL_H
- #include "mylistmodel.h"
-
- MyListModel::MyListModel(QObject *parent)
- : QAbstractListModel(parent)
- {
- m_data.append(Data("zhangsan",12)); //放入数据
- m_data.append(Data("lisi", 13));
- m_data.append(Data("wangwu", 14));
- }
-
- int MyListModel::rowCount(const QModelIndex &parent) const
- {
- // For list models only the root node (an invalid parent) should return the list's size. For all
- // other (valid) parents, rowCount() should return 0 so that it does not become a tree model.
- if (parent.isValid())
- return 0;
-
- return m_data.count();
- }
-
- QVariant MyListModel::data(const QModelIndex &index, int role) const
- {
- if (!index.isValid())
- return QVariant();
-
- if(role == MyListModel::Name)
- return m_data[index.row()].m_name;
- else if(role == MyListModel::Value)
- return m_data[index.row()].m_value;
-
- return QVariant();
- }
-
- QHash<int, QByteArray> MyListModel::roleNames() const
- {
- QHash<int, QByteArray> roles;
- roles.insert(MyListModel::Name,"name"); //C++端使用枚举,QML端使用QString
- roles.insert(MyListModel::Value,"value");
-
- return roles;
- }
在main.cpp中注册。
- int main(int argc, char *argv[])
- {
- QGuiApplication app(argc, argv);
-
- MyListModel model;
-
- QQmlApplicationEngine engine;
- qmlRegisterType<MyListModel>("MyListModel", 1, 0, "MyListModel");
- engine.rootContext()->setContextProperty("myModel",&model);//设置全局访问
-
- engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
- if (engine.rootObjects().isEmpty())
- return -1;
-
- return app.exec();
- }
直接使用name 和value就能访问数据了。
- import MyListModel 1.0
-
- Window {
- id: window
- objectName: "window"
- visible: true
- width: 400
- height: 500
- title: qsTr("Hello World")
-
-
- ListView{
- width: 200
- height: 300
- model: myModel
- delegate: Text{
- text: name + " " + value
- }
- }
- }
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。