二十六、模型、视图、代理

二十六、模型、视图、代理

模型(Model)

InterView框架中所有模型都基于抽象基类QAbstractItemModel类,此类由QAbstractListModel、QAbstractTableModel和QAbstractProxyModel类继承。

视图(View)

InterView框架中的所有视图都是基于抽象基类QAbstractItemView类,此类由QColumnView、QHeaderView、QListView、QTableView和QTreeView继承。

代理(Delegate)

InterView 框 架 中 的 所 有 代 理 都 基 于 抽 象 基 类QAbstractItemDelegate类,此类由QItemDelegate和QStyledItemDelegate类继承
 

这里我们只做一些模型和视图的项目,代理的项目就不做了

首先看模型的项目

实现以下功能

首先我们随便创建一个工程,因为接下来我们自己创建一个类,并且在main函数中使用,我们把类名取名为“ModelExtended”。

首先看modelextended.h

#ifndef MODELEXTENDED_H
#define MODELEXTENDED_H

#include<QAbstractTableModel>
#include<QVector>
#include<QMap>
#include<QStringList>

class ModelExtended : public QAbstractTableModel
{
    Q_OBJECT
public:
    explicit ModelExtended(QObject *parent=0);

    virtual int rowCount(const QModelIndex &parent=QModelIndex()) const; //行
    virtual int columnCount(const QModelIndex &parent=QModelIndex()) const; //列
    QVariant data(const QModelIndex &index,int role) const; //显示数据
    QVariant headerData(int section,Qt::Orientation orientation,int role) const; //设置表头

private:
    QVector<short> empIndex;
    QVector<short> empNameIndex;

    QMap<short,QString> empNo;
    QMap<short,QString> empName;

    QStringList viewListTitle;
    QStringList empDepartment;

    void modelFunc();
};

#endif // MODELEXTENDED_H

int QAbstractItemModel::rowCount(const QModelIndex &parent = QModelIndex()) const:

返回给定父项下的行数。当父元素有效时,意味着rowCount返回父元素的子元素个数。
注意:当实现基于表的模型时,当父元素有效时,rowCount()应该返回0。
注意:这个函数可以通过元对象系统从QML调用。看到Q_INVOKABLE。

int QAbstractItemModel::columnCount(const QModelIndex &parent = QModelIndex()) const:

返回给定父元素的子元素的列数。
在大多数子类中,列的数量与父类无关。

QVariant QAbstractItemModel::data(const QModelIndex &index, int role = Qt::DisplayRole) const:

为索引引用的项返回存储在给定角色下的数据。
注意:如果没有要返回的值,则返回无效的QVariant,而不是返回0。
注意:这个函数可以通过元对象系统从QML调用。看到Q_INVOKABLE。

QVariant QAbstractItemModel::headerData(int section, Qt::Orientation orientation, int role = Qt::DisplayRole) const:

以指定方向返回头部中给定角色和部分的数据。
对于水平标头,区段号对应于列号。类似地,对于垂直标头,节号对应于行号。
注意:这个函数可以通过元对象系统从QML调用。看到Q_INVOKABLE。

modelextended.cpp

#include "modelextended.h"

ModelExtended::ModelExtended(QObject *parent) :
    QAbstractTableModel(parent)
{
    empNo[1]="112233";
    empNo[2]="445566";
    empNo[3]="778899";

    empName[1]="zhangsan";
    empName[2]="lisi";
    empName[3]="wangwu";

    modelFunc();
}

void ModelExtended::modelFunc()
{
    viewListTitle<<"员工编号"<<"员工姓名"<<"员工部门";
    empIndex<<1<<2<<3;
    empNameIndex<<1<<2<<3;
    empDepartment<<"营销部"<<"财务部"<<"研发部";
}

int ModelExtended::rowCount(const QModelIndex &parent) const
{
    return empIndex.size();
}

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

QVariant ModelExtended::data(const QModelIndex &index, int role) const
{
    if(!index.isValid()) return QVariant();

    if(role==Qt::DisplayRole)
    {
        switch (index.column())
        {
        case 0:
            return empNo[empIndex[index.row()]];
            break;
        case 1:
            return empName[empNameIndex[index.row()]];
            break;
        case 2:
            return empDepartment[index.row()];
            break;
        default:
            return QVariant();
            break;
        }
    }
    return QVariant();
}

QVariant ModelExtended::headerData(int section, Qt::Orientation orientation, int role) const
{
    if(role==Qt::DisplayRole && orientation==Qt::Horizontal)
        return viewListTitle[section];
    return QAbstractTableModel::headerData(section,orientation,role);
}

这段代码是一个继承自QAbstractTableModel的自定义Model,用于在视图中显示员工的编号、姓名和部门。其中,modelFunc()函数用于初始化一些数据,rowCount()函数返回员工数量,columnCount()函数返回3列,data()函数用于返回每个单元格的数据,headerData()函数用于返回表头数据。具体实现细节可以参考代码注释。

DisplayRole

int QModelIndex::column() const:

返回此模型索引所引用的列

一下实现视图功能

直接在main函数里实现

#include "mainwindow.h"

#include <QApplication>

#include<QAbstractItemView>
#include<QAbstractItemModel>
#include<QItemSelectionModel>
#include<QSplitter>
#include<QDirModel>
#include<QTreeView>
#include<QListView>
#include<QTableView>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //    MainWindow w;
    //    w.show();

    QDirModel model;
    QTreeView tree;
    QListView list;
    QTableView table;

    tree.setModel(&model);
    list.setModel(&model);
    table.setModel(&model);

    QObject::connect(&tree,SIGNAL(doubleClicked(QModelIndex)),&list,SLOT(setRootIndex(QModelIndex)));
    QObject::connect(&tree,SIGNAL(doubleClicked(QModelIndex)),&table,SLOT(setRootIndex(QModelIndex)));

    QSplitter *qsp=new QSplitter;
    qsp->addWidget(&tree);
    qsp->addWidget(&list);
    qsp->addWidget(&table);

    qsp->show();

    return a.exec();
}

这段代码主要是使用Qt框架实现了一个简单的文件浏览器。具体实现过程如下:
1. 引入必要的头文件。
2. 实例化QApplication对象。
3. 实例化QDirModel对象,该对象提供了一个文件系统模型,可以用于显示文件系统的目录结构。
4. 实例化QTreeView、QListView、QTableView对象,分别用于以树形结构、列表结构、表格结构显示文件系统的目录结构。
5. 将QDirModel对象设置为QTreeView、QListView、QTableView的模型。
6. 通过QObject::connect()函数将QTreeView的doubleClicked()信号与QListView和QTableView的setRootIndex()槽函数连接起来,实现双击QTreeView中的目录项时,QListView和QTableView同时显示该目录下的文件和子目录。
7. 实例化QSplitter对象,将QTreeView、QListView、QTableView添加到QSplitter中,实现三个视图的分割显示。
8. 显示QSplitter。

void QAbstractItemView::doubleClicked(const QModelIndex &index):

该信号在双击鼠标按钮时发出。鼠标双击的项由index指定。该信号仅在索引有效时发出。

void QAbstractItemView::setRootIndex(const QModelIndex &index):

将根项设置为给定索引处的项。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/244065.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

为什么需要分库分表,如何实现?

本文我们主要讲解“为什么需要分库分表&#xff0c;如何实现”。 在前文中讲到了读写分离&#xff0c;读写分离优化了互联网读多写少场景下的性能问题&#xff0c;考虑一个业务场景&#xff0c;如果读库的数据规模非常大&#xff0c;除了增加多个从库之外&#xff0c;还有其他…

爬虫 scrapy ——scrapy shell调试及下载当当网数据(十一)

目录 一、scrapy shell 1.什么是scrapy shell&#xff1f; 2.安装 ipython 3.使用scrapy shell 二、当当网案例 1.在items.py中定义数据结构 2.在dang.py中解析数据 3.使用pipeline保存 4.多条管道的使用 5.多页下载 参考 一、scrapy shell 1.什么是scrapy shell&am…

行业锦囊|住建厅CA证书使用指南

数字化、高效率、低成本已成为企业发展转型的重要考量因素&#xff0c;建筑工程企业也不例外。而工程资料签署和管理又是每个建筑工程企业发展转型绕不开的课题&#xff1a;在建工程项目异地盖章周期性长、庞大的签署量及海量的文件管理如何优化&#xff1b;企业如何缩短对公业…

AXURE地图获取方法

AXURE地图截取地址 https://axhub.im/maps/ 1、点击上方地图或筛选所需地区的地图&#xff0c;点击复制到 Axure 按钮&#xff0c;到 Axure 粘贴就可以了 2、复制到 Axure 后&#xff0c;转化为 svg 图形&#xff0c;就可以随意更改尺寸/颜色/边框&#xff0c;具体操作如下&am…

【AI美图】第01期效果图,AI人工智能无绘画,美图欣赏

人工智能被各大平台传递&#xff0c;我也来凑一下热闹&#xff0c;放一组基础图片展示 介绍一下模型来源Stability AI&#xff1a; Stability AI直接将模型开源&#xff0c;且方式之粗暴&#xff0c;几乎完全不对生成内容做任何审核或者过滤。目前发布的稳定版本仅包含部分关…

ProcessOn基本介绍和完成案列和自定义元件

ProcessOn基本介绍和完成案列和自定义元件 1.什么是ProcessOn2.初步使用ProcessOn3.使用ProcessOn完成医疗项目门诊模块的流程图4.使用ProcessOn完成医疗项住院模块的流程图5.使用ProcessOn完成医疗项目药房模块的流程图5.使用ProcessOn完成会议oa模块的流程图6.自定义原件库1.…

设计表单表格组件

前言 什么是表单表格呢&#xff1f;简单来说就是在一个表格里面进行表单操作&#xff0c;执行增删改查。这在一些后台管理系统中是尤为常见的。 今天我们根据vue2 element-ui来设计一个表单表格组件。&#xff08;不涉及完整代码&#xff0c;想要使用完整功能可以看底部连接…

超级计算机行业分析:中国市场概念及发展现状研究

近年来&#xff0c;在技术研发和产业应用的共同推动下&#xff0c;中国超级计算机(简称“超算”)快速发展——技术创新方面&#xff0c;采用自主研发芯片的多个国内超算曾在世界超算榜单上排名第一;整体规模方面&#xff0c;在最新发布的全球超算榜单中&#xff0c;中国占比超过…

<博图> 浮点数(real)相加时结果不精确的解决方法

问题截图&#xff1a; 每按下一次按钮&#xff0c;浮点数1 加0.1&#xff0c;结果放在浮点数1中&#xff1b;在加到第8次时会多出小数点位数。 解决方法&#xff1a; 对要进行相加的浮点数进行转换&#xff0c;如下 &#xff1a; &#xff08;注&#xff1a;如果图片模糊保存…

流程图、泳道图的介绍和示例分享,以及自定义元件库的介绍

目录 一. 流程图介绍 二. Processon使用 新建一个流程图 图形的使用 三. 流程图示例 登录界面 门诊业务流程图 住院业务流程图 药房业务流程图 会议OA流程图 四. 泳道图介绍 五. 自定义元件库 5.1 新建一个元件库 5.2 创建元件 5.3 使用自定义元件库 一. 流程图介…

四六级高频词组9

目录 词组 其他链接 词组 351. be guilty of 犯有…罪或过失 352. be in the habit of 习惯于 353. break off &#xff08;a habit&#xff09; 改掉&#xff08;某种习惯&#xff09; 354. break sb. of &#xff08;a habit&#xff09;使某人改掉&#xff08;某习惯&a…

UI自动化Selenium 测试报告BeautifulReport使用及修改

一、BeautifulReport安装 pip安装 pip install BeautifulReport Pycharm中安装 二、原生报告样式 原生报告&#xff0c;因为我使用ddtunittest数据驱动模式&#xff0c;所以Excel中所有参数都会被拼接出来&#xff0c;导致测试方法里面有太多不需要展示的内容&#xff1b; …

关于impdp导入时候索引是否使用了并行了?

关于impdp导入时候索引是否使用了并行的问题&#xff0c;不是看sqlfile&#xff0c;而是看实际worker 参看&#xff1a;Impdp Parallel Index Creation Always Creates Indexes with Degree 1 (Doc ID 1289032.1&#xff09; Oracle Database - Enterprise Edition - Version …

JavaScript如果实现一段文字的高亮显示

JavaScript实现将一段文字检索高亮显示,效果如下: 实现方法:调用highlight函数 highlight("JavaScript如果实现一段文字的高亮显示", "高亮")实战代码实现: function highlight(value, search)

android studio 创建按钮项目

1&#xff09;、新建一个empty activity项目&#xff0c;切换到project视图&#xff1a; 2&#xff09;、修改app\src\main\res\layout\activity_main.xml文件&#xff0c;修改后如下&#xff1a; <?xml version"1.0" encoding"utf-8"?> <andr…

人机融合与意图理解

人机融合本质上是人类智能与机器自动化之间的协同。 人机融合的目标是利用人类智能和机器自动化的优势&#xff0c;使二者相互补充、相互支持&#xff0c;共同实现更高效、更智能的工作和生活方式。 人类智能和机器自动化具有不同的特点和优势。人类智能具有创造性、灵活性、推…

B站武sir-django教程(2)

day16 Django开发 主题&#xff1a;员工管理系统 1.新建项目 2.创建app python manage.py startapp app01注册app&#xff1a; 3.设计表结构&#xff08;django&#xff09; from django.db import modelsclass Department(models.Model):""" 部门表 "&…

38.如何让自动注入找到多个依赖Bean时不报错

1、引言 当我们从 Spring 容器中“拉”取一个 Bean 回来的时候&#xff0c;可以按照名字去拉取&#xff0c;也可以按照类型去拉取&#xff0c;按照 BeanName 拉取的话&#xff0c;一般来说只要 BeanName 书写没有问题&#xff0c;都是没问题的。但是如果是按照类型去拉取&…

四六级高频词组8

目录 词组 其他链接 词组 301. in fashion&#xff08;stylish&#xff0c; most modern&#xff09;时兴&#xff0c;流行 302. after the fashion &#xff08;of&#xff09; 依照… 303. find fault with&#xff08;complain about&#xff1b;criticize&#xff09;找…

Spring Bean基础

写在最前面: 本文运行的示例在我github项目中的spring-bean模块&#xff0c;源码位置: spring-bean 前言 为什么要先掌握 Spring Bean 的基础知识&#xff1f; 我们知道 Spring 框架提供的一个最重要也是最核心的能力就是管理 Bean 实例。以下是其原因&#xff1a; 核心组件…
最新文章