当前位置:   article > 正文

QML学习十六:ListView的简单使用(使用C++ Model)_qlistmodel

qlistmodel

若该文为原创文章,转载请注明原文出处

一、如何使用C++自定义Model

ListView可以使用C++语言定义的Model,可以从QAbstractItemModel或者QAbstractListModel继承来实现自己的Model类。

具体如何实现?

其实只需要重写rowCount()、data()、rowNames()这三个方法。
对于Qt Quick中的ListView,Delegate通过role-name来访问Model中的数据,当我们在QML中写下Text{text:desc;}这样的Delegate时,意味着将名字为desc的role对应的数据赋值给Text对象的text属性。

如何从desc找到实际的数据

这就要依赖rowNames()函数,QHash<int,QBythArray> roleNames() const 返回一个哈希表,将role与rolename关联起来,当QML中提供role-name时,那么就可以反查到role,进而以查到的role来调用data()方法,就可以获取到实际的数据。

二、例子

工程所使用的是第一个qml工程。

一、创建C++ Model

1、创建文件

 类名:QListModel,继承QAbstractListModel.

 创建完成后,文件会自动生成headerData()、rowCount()、data()等函数。

而我们要做的就是修改这些函数。headerData()函数没什么用,可以删除。

二、修改QlistModel文件

1、创建数据

在QListModel.h中创建 QHash和QList。

在QListModel.cpp中创建数据

2、重写rowCount()、data()、rowNames()

返回QHash数据:

 返回数据长度:

 

 获取数据:

三、C++Model注册

注册相对简单,直接注册就好。

四、QML调用model

 在qml下直接访问

 

 三、完整代码

 1、main.cpp

  1. #include <QGuiApplication>
  2. #include <QQmlApplicationEngine>
  3. #include <QQmlContext>
  4. #include "myobject.h"
  5. #include "QListModel.h"
  6. int main(int argc, char *argv[])
  7. {
  8. QCoreApplication::setAttribute(Qt::AA_EnableHighDpiScaling);
  9. QGuiApplication app(argc, argv);
  10. QQmlApplicationEngine engine;
  11. QListModel listModel;
  12. engine.rootContext()->setContextProperty("QListModel", &listModel);
  13. engine.load(QUrl(QLatin1String("qrc:/main.qml")));
  14. return app.exec();
  15. }

2、QListModel.h

  1. #ifndef QLISTMODEL_H
  2. #define QLISTMODEL_H
  3. #include <QAbstractListModel>
  4. #include <QObject>
  5. struct LIST_ITEM_INFO {
  6. QString qsAnimeName;
  7. QString qsAnimeLead;
  8. };
  9. class QListModel : public QAbstractListModel
  10. {
  11. Q_OBJECT
  12. public:
  13. explicit QListModel(QObject *parent = nullptr);
  14. // Basic functionality:
  15. int rowCount(const QModelIndex &parent = QModelIndex()) const override;
  16. QHash<int,QByteArray> roleNames() const override;
  17. QVariant data(const QModelIndex &index, int role = Qt::DisplayRole) const override;
  18. Q_INVOKABLE QAbstractItemModel* model();
  19. public:
  20. enum LIST_ITEM_ROLE
  21. {
  22. animeNameRole = Qt::UserRole+1,
  23. animeLeadRole,
  24. };
  25. private:
  26. QList<LIST_ITEM_INFO> m_date;
  27. QHash<int,QByteArray> m_roleName;
  28. };
  29. #endif // QLISTMODEL_H

3、QListModel.cpp

  1. #include "QListModel.h"
  2. QListModel::QListModel(QObject *parent)
  3. : QAbstractListModel(parent)
  4. {
  5. m_roleName.insert(animeNameRole, "animeName");
  6. m_roleName.insert(animeLeadRole, "animeLead");
  7. m_date = {
  8. { "vivo", "1200"},
  9. { "meizu", "1300"},
  10. { "apple", "1400"},
  11. { "huawei", "1500"},
  12. };
  13. }
  14. QHash<int, QByteArray> QListModel::roleNames() const
  15. {
  16. return m_roleName;
  17. }
  18. int QListModel::rowCount(const QModelIndex &parent) const
  19. {
  20. if (parent.isValid())
  21. return 0;
  22. return m_date.size();
  23. }
  24. QVariant QListModel::data(const QModelIndex &index, int role) const
  25. {
  26. if (!index.isValid())
  27. return QVariant();
  28. switch(role)
  29. {
  30. case animeNameRole:
  31. return m_date.value(index.row()).qsAnimeName;
  32. case animeLeadRole:
  33. return m_date.value(index.row()).qsAnimeLead;
  34. default:
  35. break;
  36. }
  37. return QVariant();
  38. }
  39. QAbstractItemModel *QListModel::model()
  40. {
  41. return this;
  42. }

4、MyListView.qml

  1. import QtQuick 2.7
  2. import QtQml.Models 2.12
  3. Rectangle {
  4. id: listViewRct
  5. width: 400
  6. height: 300
  7. ListView {
  8. id: listView
  9. anchors.fill: parent
  10. model: QListModel
  11. delegate: listViewDelegate
  12. highlight: Rectangle {
  13. color: "yellow"
  14. }
  15. }
  16. Component {
  17. id: listViewDelegate
  18. Item {
  19. id: listItem
  20. width: parent.width
  21. height: 30
  22. Text {
  23. anchors.verticalCenter: parent.verticalCenter
  24. anchors.left: parent.left
  25. anchors.leftMargin: 5
  26. text: qsTr(animeName + ":" + animeLead)
  27. font.family: "微软雅黑"
  28. font.pointSize: 12
  29. color: "#46A4BB"
  30. }
  31. MouseArea {
  32. anchors.fill: parent
  33. onClicked: {
  34. listItem.ListView.view.currentIndex = index;
  35. }
  36. }
  37. }
  38. }
  39. }

5、main.qml

  1. import QtQuick 2.12
  2. import QtQuick.Window 2.12
  3. import QtQuick.Controls 2.12
  4. import QtQuick.Layouts 1.12
  5. Window {
  6. id: window
  7. visible: true
  8. width: 600
  9. height: 480
  10. title: qsTr("QML自定义组件")
  11. Rectangle {
  12. id: baseRct
  13. anchors.fill: parent
  14. color: "lightblue"
  15. MyListView {
  16. anchors.centerIn: parent
  17. }
  18. }
  19. }

编译结果:

四、总结

自定义model主要是要重写data()等函数,QTableModel、QTableModel调用方法也类似。

如有侵权,请及时联系博主删除,VX:18750903063

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

闽ICP备14008679号