当前位置:   article > 正文

QML 使用自定义ListModel_重写listmodel

重写listmodel

1.简介

QAbstractListModel类提供了一个抽象模型,可以子类化它来创建一维列表模型。

以下示例实现一个最简单的ListModel,需要重写以下几个方法。

2.自定义ListModel

  1. #ifndef MYLISTMODEL_H
  2. #define MYLISTMODEL_H
  3. #include <QAbstractListModel>
  4. #include <QList>
  5. //自定义抽象数据类型
  6. class Data
  7. {
  8. public:
  9. Data(const QString &name, int value) : m_name(name),m_value(value){
  10. };
  11. QString m_name;
  12. qint32 m_value;
  13. };
  14. class MyListModel : public QAbstractListModel
  15. {
  16. Q_OBJECT
  17. public:
  18. enum RoleNames{
  19. Name = Qt::DisplayRole+1,
  20. Value
  21. };
  22. // Basic functionality:
  23. int rowCount(const QModelIndex &parent = QModelIndex()) const override;
  24. QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
  25. virtual QHash<int, QByteArray> roleNames() const override;
  26. explicit MyListModel(QObject *parent = nullptr);
  27. private:
  28. QList<Data> m_data;
  29. };
  30. #endif // MYLISTMODEL_H
  1. #include "mylistmodel.h"
  2. MyListModel::MyListModel(QObject *parent)
  3. : QAbstractListModel(parent)
  4. {
  5. m_data.append(Data("zhangsan",12)); //放入数据
  6. m_data.append(Data("lisi", 13));
  7. m_data.append(Data("wangwu", 14));
  8. }
  9. int MyListModel::rowCount(const QModelIndex &parent) const
  10. {
  11. // For list models only the root node (an invalid parent) should return the list's size. For all
  12. // other (valid) parents, rowCount() should return 0 so that it does not become a tree model.
  13. if (parent.isValid())
  14. return 0;
  15. return m_data.count();
  16. }
  17. QVariant MyListModel::data(const QModelIndex &index, int role) const
  18. {
  19. if (!index.isValid())
  20. return QVariant();
  21. if(role == MyListModel::Name)
  22. return m_data[index.row()].m_name;
  23. else if(role == MyListModel::Value)
  24. return m_data[index.row()].m_value;
  25. return QVariant();
  26. }
  27. QHash<int, QByteArray> MyListModel::roleNames() const
  28. {
  29. QHash<int, QByteArray> roles;
  30. roles.insert(MyListModel::Name,"name"); //C++端使用枚举,QML端使用QString
  31. roles.insert(MyListModel::Value,"value");
  32. return roles;
  33. }

在main.cpp中注册。

  1. int main(int argc, char *argv[])
  2. {
  3. QGuiApplication app(argc, argv);
  4. MyListModel model;
  5. QQmlApplicationEngine engine;
  6. qmlRegisterType<MyListModel>("MyListModel", 1, 0, "MyListModel");
  7. engine.rootContext()->setContextProperty("myModel",&model);//设置全局访问
  8. engine.load(QUrl(QStringLiteral("qrc:/main.qml")));
  9. if (engine.rootObjects().isEmpty())
  10. return -1;
  11. return app.exec();
  12. }

3.QML中使用

直接使用name 和value就能访问数据了。

  1. import MyListModel 1.0
  2. Window {
  3. id: window
  4. objectName: "window"
  5. visible: true
  6. width: 400
  7. height: 500
  8. title: qsTr("Hello World")
  9. ListView{
  10. width: 200
  11. height: 300
  12. model: myModel
  13. delegate: Text{
  14. text: name + " " + value
  15. }
  16. }
  17. }

4.运行结果

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小丑西瓜9/article/detail/170694
推荐阅读
相关标签
  

闽ICP备14008679号