qt Model_View_Delegate 模型_视图_代理

2023-11-08

QT当中model-view-delegate(模型-视图-代理),此结构实现数据和界面的分离。Qt的模型-视图结构分为三部分:模型(model)-视图(view)-代理(Delegate)。其中模型与数据源通信;并为其它部件提供接口;视图从模型中引用数据条目的模型索引(ModelIndex)。在视图当中,代理负责绘制数据条目,比如编辑条目,代理和模型进行直接通信。

 关系:

模型、视图、代理是MVC模式中的三个核心组件,各自承担不同的职责。

  • 模型(Model):负责存储数据和对数据进行处理,提供访问和修改数据的接口。模型通常是应用程序最底层的部分,与具体业务逻辑有关。
  • 视图(View):负责展示数据给用户,并且提供交互操作。视图通常是用户与应用程序交互的主要界面,如Web页面、桌面应用程序的窗口等。
  • 代理(Proxy):作为“中间人”,实现模型和视图之间的沟通。代理通常是一些中间件或者控制器,用于管理模型和视图之间的通信流程,以确保它们之间的正确性和可靠性。

在MVC架构中,模型、视图、代理之间的关系如下图所示:

当用户与视图交互时,视图会向代理发送请求,代理会将请求转发给模型进行处理。模型完成数据的处理后,将结果返回给代理,代理再将结果传递给视图,视图最终显示给用户。在这个交互过程中,代理扮演着重要的角色,它不仅负责将请求传递给模型,还需要处理模型返回的数据,以便视图能够正确地显示数据。

1.模型 model

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

用于将数据存储在特定格式中并提供访问和操作这些数据的方法。它们实现了Qt Model/View体系结构的核心,允许在用户界面中呈现数据。Qt提供了多种类型的model,包括列表、表格、树形结构等。通过使用标准接口来访问model,可以轻松地进行数据排序、过滤、插入、修改和删除操作。Model通常与view(视图)搭配使用,以便在GUI中显示数据。常用的model有QStandardItemModel、Q、QSqlQueryModel、QFileSystemModel等。

2.视图 View

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

Qt中的View是指数据可视化的组件,用于将model中的数据以某种方式呈现给用户。View通常与model搭配使用,以便在GUI中显示数据。Qt提供了多种类型的view,包括列表、表格、树形结构等。通过使用标准接口来访问view,可以轻松地对其进行设置和定制,如更改列宽度、行高度、排序、过滤等。常用的view有QTableView、QListView、QTreeView等。

对于不同类型的view,Qt还提供了各种内置功能和自定义选项,例如:QTableView提供了单元格编辑、复选框、进度条等;QListView提供了图标、文本、列表、网格等不同的显示方式;QTreeView提供了可展开的树形结构和可收缩的节点等。此外,还可以通过实现自定义view来创建特定需求的数据可视化组件。

3.代理 Delegate

InterView框架中的所有代理都基于抽象基类QAbstractltemDelegate类,
此类由QltemDelegate和QStyledltemDelegate类继承。

Delegate(代理)是Qt中非常重要的一种机制,它提供了灵活的控件定制和事件处理能力。Delegate通常用于为模型提供自定义渲染和编辑,并且可以处理与控件交互相关的事件。

在Qt中,每个控件都有一个默认的delegate,但是这个delegate只提供了基本的呈现和编辑功能。如果需要更多的定制,就需要使用自定义delegate了。

自定义delegate通常继承自QStyledItemDelegate或QAbstractItemDelegate类。QStyledItemDelegate提供了一些方便的函数来绘制和编辑数据项,而QAbstractItemDelegate则提供了更高级的控制能力。

自定义delegate需要实现以下三个函数:

  1. paint():用于绘制数据项的外观。

  2. createEditor():用于创建编辑器,以便用户编辑数据项。

  3. setEditorData()和setModelData():用于将数据从编辑器传输到模型,以及从模型传输到编辑器。

除了这些核心函数外,还可以通过其他一些函数来控制delegate的外观和行为,例如sizeHint()、updateEditorGeometry()等。

举例1:

 效果:

main.cpp

#include "mainwindow.h"

#include <QApplication>
#include <QAbstractItemModel>   //模型
#include <QAbstractItemView>  //视图
#include <QItemSelectionModel> // 模式

#include <QSplitter>  //分割窗口
#include <QDirModel>  //用于展示文件系统目录结构。
#include <QListView> //列表视图
#include <QTreeView> //树视图
#include <QTableView> //表视图

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    //MainWindow w;
    //w.show();

    QDirModel model; //专门用于获取磁盘文件目录的数据模型  类似QFileSystemModel类
    QTreeView tree; //树形视图
    QListView list; //列表视图
    QTableView table;//表视图

    //设置数据模型
    tree.setModel(&model);
    list.setModel(&model);
    table.setModel(&model);

    //设置树形视图的选择模式为多选模式,允许用户通过按住Ctrl键或Shift键来同时选择多个树节点。
    tree.setSelectionMode(QAbstractItemView::MultiSelection);

    //将树形结构控件(tree)的选择模型(selectionModel)设置为列表控件(list)的选择模型。
    //这样做的目的是让两个控件共用同一个选择模型,以便在对它们进行选择操作时能够保持同步。
    list.setSelectionModel(tree.selectionModel());
    table.setSelectionModel(tree.selectionModel());

    //连接槽函数
    QObject::connect(&tree,SIGNAL(doubleClicked(QModelIndex)),&list,SLOT(setRootIndex(QModelIndex)));
    QObject::connect(&tree,SIGNAL(doubleClicked(QModelIndex)),&table,SLOT(setRootIndex(QModelIndex)));

    QSplitter *qslter=new QSplitter(Qt::Horizontal);  //水平分割窗口
    qslter->addWidget(&tree);
    qslter->addWidget(&list);
    qslter->addWidget(&table);

    qslter->show();


    return a.exec();
}

 举例2:

效果:

 

自定义表模型类显示

Modelextended.h

#ifndef MODELEXTENDED_H
#define MODELEXTENDED_H
#include <QAbstractTableModel>
#include <QVector>
#include <QStringList>
#include <QMap>

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

    //系统自带的model相关的函数进行重新定义
    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 orientateion,int role) const; //设置表头数据



private:
    //QVector向量容器 QVector是Qt对所有数组的封装
    QVector<short> empindex;  //短整型数组
    QVector<short> empnameindex;

    //Qmap是qt通用容器,存储(键,值),并提供与键相关联值的的快速查找 是按键的ASCII码排序存储的
    QMap<short,QString> empno; //存放员工编号
    QMap<short,QString> empname;//存放员工姓名


    //Qstringlist提供一个字符串列表
    //QStringlist 添加QString 字符串,直接用<<来添加字符串
    QStringList viewlisttitle;//存放标题名称
    QStringList department_list; //存放员工部门


    void ModelFunc();

};

#endif // MODELEXTENDED_H

Modelextended.cpp

#include "Modelextended.h"

ModelExtended::ModelExtended(QObject *parent):QAbstractTableModel(parent)
{
    //员工编号赋值
    empno[1]="2022001";
    empno[2]="2022002";
    empno[3]="2022003";
    empno[4]="2022004";
    empno[5]="2022005";

    //员工姓名赋值
    empname[1]="李哥";
    empname[2]="张哥";
    empname[3]="王哥";
    empname[4]="刘哥";
    empname[5]="齐哥";

    department_list<<"财务部"<<"研发部"<<"销售部"<<"后勤部"<<"董事会";

    ModelFunc(); //模型设计



}
void ModelExtended::ModelFunc() //模型设置
{
    //设置标题
    viewlisttitle<<"员工编号"<<"员工姓名"<<"部门";
    empindex<<1<<2<<3<<4<<5;
    empnameindex<<1<<2<<3<<4<<5;
}

 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()){  //判断index是否有效合法
        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 department_list[index.row()];
            break;
        default:
            return QVariant();
        }
    }

    return  QVariant();
}
QVariant ModelExtended::headerData(int section,Qt::Orientation orientateion,int role) const //设置表头数据
{
    //首先判断角色(role)和方向(orientation)。如果角色是Qt::DisplayRole(用于显示数据),
    //方向是水平方向(即列标题),那么就返回对应列的标题文本。
    if(role==Qt::DisplayRole && orientateion== Qt::Horizontal){
        return viewlisttitle[section];

    }

    return QAbstractTableModel::headerData(section,orientateion,role);
}

main.cpp

#include "mainwindow.h"

#include <QApplication>
#include <Modelextended.h>  //自定义模型
#include <QTableView> //表视图

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

    ModelExtended modeex;
    QTableView view;
    view.setModel(&modeex);

    //view->setWindowTitle("表视图模型测试");
    //view->resize(600,500);

    view.show();



    return a.exec();
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

qt Model_View_Delegate 模型_视图_代理 的相关文章

  • Qt 人工鼠标点击无法正常工作

    小玩具应用程序可以在这里找到 http gist github com 517445 http gist github com 517445 我正在尝试将人工鼠标事件发送到小部件 我使用QApplication sendEvent为此 接下
  • Qt qDebug() 在 Windows shell 中不起作用

    我正在使用一个qDebug Qt 框架的printf屏幕上有东西 当我从 Qt Creator 运行应用程序时它工作得很好 但是当我尝试从 Windows 执行它时cmd它什么也没显示 为什么会发生这种情况 你必须添加 CONFIG con
  • new 运算符(以及 malloc)无法分配约 450 MB 的内存 [重复]

    这个问题在这里已经有答案了 我正在开发一个程序 该程序在内存中存储大约 2 2 亿个短值的数组 该数据块的分配方式如下 short arrayName new short SIZE OF ARRAY 然后将文件的内容读入内存 在团队中的另一
  • QMutex 是否需要是静态的,以便此类实例的其他线程调用知道暂停其操作?

    从多个线程调用以下附加函数 我不希望数据重写附加 因为计数器尚未增加 除了当前使用 Append 的线程之外 这是否会挂起所有进入的线程 或者其他线程会继续运行而不追加数据吗 互斥锁是否需要是 静态 的 或者每个实例都知道要暂停操作吗 如果
  • 第一次信号发射后自动断开

    我正在从文件加载网页 然后替换其中的一些 html self template web page QtWebKit QWebPage self template web page mainFrame load QtCore QUrl tem
  • QT:删除QGridLayout中QLabel之间的空格

    我将一些具有不同颜色的 QLabels 添加到 QGridLayout 作为 QWidget 的布局 现在我在每个 Qlabel 与下一个 Qlabel 之间有一个间距 我想将其删除 我尝试将标签的边距设置为 0 将 GridLayout
  • 获取 QListView 中所有可见项目的简单方法

    我正在尝试使用 Qt Framework 开发一个图像库应用程序 应用程序从所选文件夹加载所有图像 并使用 QListView 控件显示这些图像 但现在我想通过仅加载用户可见的图像来减少内存消耗 由于没有直接函数来获取视图中的所有可见项目
  • Qt 为什么使用 QString::number() 而不是 QLocale().toString()?

    我正在开发的应用程序将在许多国家推出 并且需要支持他们的语言 我一直在回顾我的代码并替换以下每个实例 QString number and QString toDouble with QLocale toString and QLocale
  • 如何在Qt 5中的paintEvent上使用mouseMoveEvent?

    我是 Qt 和 c 的新手 所以我遇到了一些困难 我正在尝试创建一个小部件 它可以获取 mouseMoveEvent 位置并在鼠标位置的像素图上绘制椭圆 下面你可以看到代码 include myimage h include
  • QML 中可重用的字体属性[重复]

    这个问题在这里已经有答案了 在 QML 中 我希望能够定义一组字体属性以进行简单的语义重用 例如 代替 Text text This is a header font family Encode Sans weight Font Black
  • QTableView 并双击一个单元格

    我正在开发测试用例编辑器 该编辑器包含 USART 传输和接收数据包格式 编辑器是一个表格视图 发送和接收数据包的长度为八个字节 例如 0x01 0x02 0x03 0x08 它在我的第五和第六栏中 现在 我希望此列中的单元格为只读 但是当
  • 连接到 QNetworkReply::error 信号

    我正在使用 Qt5 的新连接语法 QNetworkReply 有一个名为error http qt project org doc qt 5 0 qtnetwork qnetworkreply html error 2还有一个函数叫做err
  • 如何在Android中使用QML - QWebView

    我想在 Android 中部署一个 YouTube 应用程序 但它只能在我的电脑上运行 在安卓上不起作用 它不加载任何视频 问题仅出在 QWebView 上 我使用了与此类似的代码 http doc qt io archives qt 5
  • 即使我在单独的线程中运行,QT GUI 也会冻结

    我有一个小型聊天应用程序 其中使用 SQLite 数据库来存储所有对话 我注意到该应用程序随机冻结 然后我必须最小化和最大化它才能使其再次工作 我认为问题可能是 SQLite 选择 插入导致 gui 冻结 我决定尝试将所有 SQLite 方
  • 通过引用传递 [C++]、[Qt]

    我写了这样的东西 class Storage public Storage QString key const int value const void add item QString int private QMap
  • 通过单击内部小部件而不是标题栏来移动窗口

    在 Windows 中 当我创建 QMainWindow 时 我可以通过单击标题栏并拖动它来在屏幕上移动它 在我的应用程序中 我使用隐藏了标题栏setWindowFlags Qt CustomizeWindowHint 我正在尝试使用小部件
  • 在 Qt 中自动调整标签文本大小 - 奇怪的行为

    在 Qt 中 我有一个复合小部件 它由排列在 QBoxLayouts 内的多个 QLabels 组成 当小部件调整大小时 我希望标签文本缩放以填充标签区域 并且我已经在 resizeEvent 中实现了文本大小的调整 这可行 但似乎发生了某
  • 如何将 QFile 与 std::iostream 一起使用?

    是否可以像 std iostream 一样使用 QFile 我很确定那里一定有一个包装纸 问题是在哪里 我有另一个库 它需要 std istream 作为输入参数 但在我的程序中 此时我只有一个 QFile 我使用以下代码提出了自己的解决方
  • 是否可以根据 QSlider 的位置来改变其手柄的颜色?

    我非常清楚如何通过样式表自定义 QSlider 但我想知道是否可以执行以下操作 我希望滑块的手柄从蓝色变为黄色 当设置在左侧时 它是蓝色的 设置在左侧时 它是蓝色的 当你将它向右移动时 它会出现从蓝色到黄色的渐变 如果可以通过样式表 如何实
  • qdbusxml2cpp 未知类型

    在使用 qdbusxml2cpp 程序将以下 xml 转换为 Qt 类时 我收到此错误 qdbusxml2cpp c ObjectManager a ObjectManager ObjectManager cpp xml object ma

随机推荐

  • private static final long serialVersionUID = 1L;是用来做什么的

    private static final long serialVersionUID 1L 是定义以一个序列号 java源码里有大量的类都有这么一个序列号 目的就是把java对象序列化而后进行保存 java的序列化机制式通过判断类的seri
  • IDEA上配置mysql

    IDEA是一个集成工具 它为很多工具提供了快速便捷的配置方式 配置mysql我们只需要添加Database就行了 Database一般是在右侧 找不到的话可以在View中里找到打开 如下图 添加数据库步骤 这里选上mysql 填写相应信息
  • JMeter界面字体大小修改

    1 找到jmeter所在目录 gt bin gt jmeter properties 搜索jsyntaxtextarea font size 去掉 把14改成18 2 修改右侧参数比例 jmeter所在目录 gt bin gt jmeter
  • Spring Boot 整合 Mybatis 实现 Druid 多数据源配置

    目录 1 多数据源的应 场景 2 数据库脚本 3 项目结构 4 代码 依赖 pom xml 配置文件 数据源配置类 实体类 sql映射文件 dao srvice controller 启动类 5 小节 6 事务问解决 1 多数据源的应 场景
  • C++-FFmpeg-1-VS2019-x264-fdk_aac-x265-pdb-QT5.14-makefile

    1 环境搭建 1 1VS2019 用的是控制台编译 1 2 msys2 模拟linux的命令和指令 2 源码编译与安装 2 1 x264 ffmpeg 编码用X264 2 2x265 ffmpeg 编码用X265 c 写的 msys2编译
  • 多边形的扫描转化算法

    多边形的扫描转化算法 python 实现 实验目的 实现从多边形顶点表示到点阵表示的转换 从多边形给定的边界出发 通过扫描线的方式求出位于其内部各个像素 从而达到对多边形填充的作用 算法思想 按扫描线顺序 计算扫描线与多边形的相交的交点 这
  • 竞赛 基于机器视觉的二维码识别检测 - opencv 二维码 识别检测 机器视觉

    文章目录 0 简介 1 二维码检测 2 算法实现流程 3 特征提取 4 特征分类 5 后处理 6 代码实现 5 最后 0 简介 优质竞赛项目系列 今天要分享的是 基于机器学习的二维码识别检测 opencv 二维码 识别检测 机器视觉 该项目
  • Linux性能测试工具-UnixBench--安装以及结果分析

    UnixBench unixbench是一个用于测试unix系统性能的工具 也是一个比较通用的benchmark 此测试的目的是对类Unix 系统提供一个基本的性能指示 很多测试用于系统性能的不同方面 这些测试的结果是一个指数值 index
  • pcb叠层设计及资料输出

    PCB叠层设计 一 4层板 方案1 top gnd pwr bottom 此方案也是最常见的 主要元器件和关键信号在top 方案2 top pwr gnd bottom 此方案是主要元器件放bottom 很少用 方案3 gnd s1 pwr
  • 区块链技术系列(1) - 数字签名

    导读 在现实社会中 签名作为签名者身份的一种证明 签名代表对签名文件的认可 不可抵赖 理论上签名是可信 不可伪造的 现在网络环境越来越广泛 有大量的信息通过网络传播 并且会保存在上面 这些电子数据显然无法人工签名 数字签名就孕育而生 本文将
  • SpringBoot常用注解

    前言 Spring Boot是由Pivotal团队提供的全新框架 其设计目的是用来简化新Spring应用的初始搭建以及开发过程 应用于快速应用开发领域 所需支持 Maven构建提供支持或Gradle 不懂Maven或者Gradle 的建议还
  • 基于全连接孪生网络的目标跟踪(siamese-fc)

    Fully Convolutional Siamese Networks for Object Tracking 这两年可以说deeplearning已经占领了visual object tracking这个领域 但是对于跟踪问题来说 这些
  • 在.NET Framework中的连接字符串ConnectionStrings属性

    在 NET Framework中 ConfigurationManager ConnectionStrings属性是用来访问在Visual Studio IDE应用程序配置文件中配置的数据库连接字符串的 每个连接字符串在Visual Stu
  • 建标库标准怎么导出pdf_保存和导出PDF文档,这款OCR文字识别软件能做到

    ABBYY FineReader 作为一款强大的OCR文字识别软件 如果能运用到大家的办公中 将能帮助大家将各种格式的PDF文档保存为新的PDF文档 PDF A格式文档 以及Microsoft Word Excel PPT等格式 在保存与导
  • spring 的@componentscan, @import, @configuration总结

    缝合怪 本人百度总结了几篇文章 对几篇文章进行汇总缝合总结 configuration 这个注解用来代替spring容器的xml配置文件 具体就是配置文件中的
  • VM VirtualBox 全屏模式 && 自动缩放模式 相互切换

    1 自动缩放模式 热键Host C 偶然一次机会 把虚拟机切换为了自动缩放模式 如下图 想要再切换为全屏模式 发现不知如何操作 后来折腾了一会儿 切换成功 以此备录一下 2 切换为全屏模式 热键Host F 切换为全屏模式的快捷键为Host
  • liveshare开发体验 vs_imgcook体验

    D2今年收费了 我所在创业公司没有报销 当然门票也不是什么大钱 无奈忙成狗错过了早鸟票 指望后面看看分享ppt 无意中看到D2官方流出的一个感兴趣的网址 说是 可以由视觉稿一键生成代码 https imgcook taobao org 创业
  • Kafka、RabbitMQ、RocketMQ 消息中间件的对比

    什么是消息队列 消息队列是在消息的传输过程中保存消息的容器 包含以下 3 元素 Producer 消息生产者 负责产生和发送消息到 Broker Broker 消息处理中心 负责消息存储 确认 重试等 一般其中会包含多个 Queue Con
  • 3DCAT实时云渲染助力VR虚拟现实迈向成熟

    近年来 虚拟现实 Virtual Reality VR 技术在市场上的应用越来越广泛 虚拟现实已成为一个热门的科技话题 相关数据显示 2019年至2021年 我国虚拟现实市场规模不断扩大 从2019年的282 8亿元增长至2021年的583
  • qt Model_View_Delegate 模型_视图_代理

    QT当中model view delegate 模型 视图 代理 此结构实现数据和界面的分离 Qt的模型 视图结构分为三部分 模型 model 视图 view 代理 Delegate 其中模型与数据源通信 并为其它部件提供接口 视图从模型中