我们已经多次讨论过如何创建自己的模型来表示QML中的数据,并且在上一节中我们看到了QStandardItemModel的基本示例。通常,出于性能和功能方面的原因,需要从一开始就要实现自己的模型。QAbstactItemModel类为项目模型类提供了抽象接口,并且它可以被子类化以创建您自己的模型。QAbstractListModelQAbstractTableModel继承了QAbstractItemModel,可以在创建列表或表格模型时将其子类化。在这一节中,我们将进一步介绍QAbstractTableModel

1. QAbstractTableModel

当您通过继承QAbstractTableModel来创建自己的表格模型时,您必须至少实现rowCount()columnCount()data()方法。

为了使我们的模型在QML中可用,我们还需要重新实现roleNames方法(如上一节中的QStandardItemModel示例)。

如果需要编辑模型还要实现setData()flags()方法。

为可调整大小的数据结构提供接口的模型也可以提供插入和删除行和列的实现,如果您需要这样做,一定要记住调用适当的函数,以便通知所有连接的视图发生变化:

  • 在将新行或列插入数据结构之前,必须调用beginInsertRows()beginInsertColumns(),然后立即调用endInsertRows()endInsertColumns()
  • 在从数据结构中删除行或列之前,必须调用removeRows()removeColumns(),然后立即调用endRemoveRows()endRemoveColumsn()

1.1 示例

在头文件中,我们将Car定义为存储在表格中的项。角色枚举的方式与我们在QStandardItemModel中使用的方式相同。当子类化QAbstractTableModel时,我们需要至少实现rowCount()columnCount()data()roleNames()

// customtablemodel.h#include struct Car{    QString manufacturer;    QString model;    qint16 year;};typedef QVector CarContainer;class CustomTableModel : public QAbstractTableModel{    Q_OBJECTpublic:    enum CarRoles {        ManufacturerRole = Qt::UserRole + 1,        ModelRole,        YearRole    };    explicit CustomTableModel(QObject *parent = nullptr);protected:    int rowCount(const QModelIndex &parent) const Q_DECL_OVERRIDE;    int columnCount(const QModelIndex &parent) const Q_DECL_OVERRIDE;    QVariant data(const QModelIndex &index, int role) const Q_DECL_OVERRIDE;    QHash roleNames() const Q_DECL_OVERRIDE;private:    CarContainer m_container;};

.cpp文件中的代码是不言自明的。我们在构造函数中添加数据只是为了示例:

// customtablemodel.cpp#include "customtablemodel.h"

CustomTableModel::CustomTableModel(QObject *parent) :    QAbstractTableModel(parent){    m_container = {        Car{"Mercedes", "E200D", 2014},        Car{"Toyota", "Corolla", 1998},        Car{"Audi", "A6", 2006},        Car{"Tesla", "Model 3", 2018},        Car{"Ford", "Fiesta", 2000},        Car{"Dodge", "Charger", 1968},    };}

int CustomTableModel::rowCount(const QModelIndex &parent) const{    Q_UNUSED(parent)    return m_container.count();}

int CustomTableModel::columnCount(const QModelIndex &parent) const{    Q_UNUSED(parent)    return 3;}

QVariant CustomTableModel::data(const QModelIndex &index, int role) const{    switch(role)    {    case ManufacturerRole:        return m_container[index.row()].manufacturer;    case ModelRole:        return m_container[index.row()].model;    case YearRole:        return m_container[index.row()].year;    }    return QVariant();}

QHash CustomTableModel::roleNames() const{    QHash roles;    roles[ManufacturerRole] = "manufacturer";    roles[ModelRole] = "model";    roles[YearRole] = "year";    return roles;}

然后我们像以前一样注册它(注意,在这个例子中,唯一的数据来自构造函数,因为我们没有实现从QML添加数据的功能):

// main.cppqmlRegisterType("org.mooc.customtable", 1, 0, "CustomTableModel");

在QML里,我们使用的是Qt 5.12中引入的新TableView项,因此请记住导入QtQuick 2.12(注意:不要将它与已弃用的Quick Controls 1 TabelView混淆)。我们在这里也使用了DelegateChooser,它还在Qt 5.12的实验室中,所以您需要导入Qt.labs.qmlmodels 1.0

模型中的数据可以通过roleNames()方法中定义的角色名获得。

import QtQuick 2.12import QtQuick.Window 2.12import org.mooc.customtable 1.0import Qt.labs.qmlmodels 1.0

Window {    visible: true    width: 640    height: 480    title: qsTr("CustomTableModel")

    TableView {        anchors.fill: parent        columnSpacing: 0        rowSpacing: 1        clip: true

        model: CustomTableModel {}

        delegate: DelegateChooser {            DelegateChoice {                column: 0                Rectangle {                    implicitWidth: 80                    implicitHeight: 40                    color: {                        if (row % 2 == 0)                            "lightblue";                        else                            "white";                    }                    Text {                        anchors.centerIn: parent                        text: manufacturer                    }                }            }            DelegateChoice {                column: 1                Rectangle {                    implicitWidth: 80                    implicitHeight: 40                    color: {                        if (row % 2 == 0)                            "lightblue";                        else                            "white";                    }                    Text {                        anchors.centerIn: parent                        text: model                    }                }            }            DelegateChoice {                column: 2                Rectangle {                    implicitWidth: 80                    implicitHeight: 40                    color: {                        if (row % 2 == 0)                            "lightblue";                        else                            "white";                    }                    Text {                        anchors.centerIn: parent                        text: year                    }                }            }        }    }}


Source: https://materiaalit.github.io/qt-mooc/part5/

qt 多个模型如何显示在表格中_Qt MOOC系列教程 第五章第四节:QML中的C++模型相关推荐

  1. 《Qt MOOC系列教程》第一章第二节:字符串处理和值类型

    在这一章中,我们将讨论字符串及其操作,并简要讨论Qt中的值与类型.如果您希望了解更具体的技术细节,我们鼓励您查看官方Qt文档. 1. QChar QChar类提供了一个16位的Unicode字符.在Q ...

  2. 推荐系统系列教程之十六:深度和宽度兼具的融合模型

    编者按:之前推出了<推荐系统系列教程>,反响不错,前面已经推出了十五期,今天按约推出第十六期:深度和宽度兼具的融合模型.希望粉丝朋友们多点"在看",多多转发,我会在&q ...

  3. 推荐系统系列教程之十三:如果关注排序效果,那么这个模型可以帮到你

    编者按:之前推出了<推荐系统系列教程>,反响不错,前面已经推出了十二期,今天按约推出第十三期,也是关于矩阵分解的第三篇:如果关注排序效果,那么这个模型可以帮到你.希望朋友们多点" ...

  4. 深度学习和目标检测系列教程 16-300:通过全球小麦数据集训练第一个yolov5模型

    @Author:Runsen 之前的检测系统重新利用分类器或定位器来执行检测,将模型应用于多个位置和比例的图像. Yolo 使用了一种完全不同的方法.它将单个神经网络应用于完整图像.该网络将图像划分为 ...

  5. (软件工程复习核心重点)第一章软件工程概论-第四节:软件过程及相关模型

    文章目录 一:软件过程概念 (1)定义 (2)构成 二:主要模型 (1)瀑布模型 A:定义 B:特点 C:优缺点 D::适用范围 E:实际的瀑布模型 (2)快速原型模型 A:定义 B:原理 C:优缺点 ...

  6. QT实现加载并显示多个JSON模型。

    QT实现加载并显示多个JSON模型 项目简介 项目技术 项目展示 主要源码片段解析 获取完整项目源码传送门 项目简介 加载并显示几个JSON模型. JSON模型示例演示了如何加载和显示多个JSON模型 ...

  7. qt 从文件中读出数据显示在表格中_java如何从文件中读取数据存在数组再显示在表格中!!...

    再谢谢你昨天帮我解决了那个读数据再显示在JTextArea中,现在我想显示在表格中啦!而且对应显示!数据一行一行读,再存在arraylist中数据:何子杨13580130150652150计算机丁香维 ...

  8. Java黑皮书课后题第5章:*5.31(金融应用:计算CD价值)假设你用10 000美元投资一张CD,年利率为5.75%。编写程序,提示由用户输入一个金额数、年获利率、月份数,然后显示一个表格

    5.31(金融应用:计算CD价值)假设你用10 000美元投资一张CD,年获利率为5.75%.编写程序,提示由用户输入一个金额数.年获利率.月份数,然后显示一个表格 题目 题目概述 运行示例 破题 代 ...

  9. 基于 OData 模型和 JSON 模型的 SAP UI5 表格控件行项目的添加和删除实现

    这是 Jerry 2021 年的第 62 篇文章,也是汪子熙公众号总共第 339 篇原创文章. 龟虽寿曹操神龟虽寿,犹有竟时:腾蛇乘雾,终为土灰.老骥伏枥,志在千里:烈士暮年,壮心不已.盈缩之期,不但 ...

最新文章

  1. SSAS系列——【07】多维数据(查询Cube)
  2. c#FileStream文件读写(转)
  3. mysql数据库主从不同步的解决方法
  4. 大规模服务化对于服务治理的要求
  5. QT中QTableWidget清空或删除内容功能
  6. Openwrt之移动硬盘ext3/ext4格式化工具
  7. java生成不重复随机数_生成不重复随机数 java
  8. markdown的学习
  9. [原]tornado源码分析系列(五)[HTTPServer 层]
  10. [Contest20180328]coin
  11. 中计算正方形面积的方法_风管及管道部件设计过程中常用的计算方法
  12. 面向对象2:类和对象
  13. 区块链之零知识证明(zk-SNARK从小白到明白)
  14. 百度地图点聚合仿链家定位点多级聚合,且滑动、刷新加载定位点
  15. termux获取sd卡读写权限_原来是用错了读卡器,雷克沙lexar 1667X 真实读写性能测试...
  16. 测试适合眉形的软件_扫一扫测眉毛 测试适合眉型的软件
  17. 机器人学笔记之——空间描述和变换:姿态的其他描述方法
  18. 笔记本无线网卡失效(红叉)故障排除
  19. 解决“c#:未将对象引用设置到对象的实例”
  20. 4月22日丨【云数据库技术沙龙】技术进化,让数据更智能

热门文章

  1. PHP-----PHP程序设计基础教程----第四章数组
  2. [linux][c语言]用socket实现简单的服务器客户端交互
  3. 怎样对拍、如何对拍、对拍模板
  4. JS document
  5. RAP Mock.js语法规范
  6. fwt优化+树形DP HDU 5909
  7. 解决cocos2dx 3.x 导入cocostudio的ui界面出现错位问题
  8. Entity Framework学习三:查询、插入、更新和删除操作
  9. Kali Linux python 安装pip
  10. 如何在Mac上加入adb服务