Qt 基础组件速学 interView框架

学习目标: interView理解和自定义模型操作

前置环境

运行环境:qt creator 4.12

学习内容:

interView是一个具有插件架构的Qt应用程序框架,它旨在提供一个易于扩展和定制的应用程序开发解决方案。

在interView框架中,这三者协作的方式如下:

视图类从模型类获取数据,并使用委托类来绘制和编辑数据单元格。
用户与视图进行交互(如点击、编辑等),视图类会通知模型类进行相应的数据更新。
模型类更新数据后,会通知视图类进行重绘,视图类会再次使用委托类来绘制新的数据。

在 Qt 的模型-视图架构中,这三个抽象类扮演着重要的角色:

  1. 视图类 (QAbstractItemView):

    • 视图类负责显示和管理数据项目。
    • 常见的视图类有 QListViewQTreeViewQTableView 等。
    • 视图类从模型类获取数据,并负责将数据项目渲染到屏幕上。
    • 视图类还负责处理用户交互,如鼠标点击、拖拽等操作。
  2. 模型类 (QAbstractItemModel):

    • 模型类负责存储和管理数据。
    • 常见的模型类有 QStringListModelQFileSystemModelQStandardItemModel 等。
    • 模型类提供了标准的接口,如 rowCount()columnCount()data() 等,供视图类查询和操作数据。
    • 模型类可以是层次结构,如 QAbstractItemModel 的子类 QAbstractTableModel
  3. 委托类 (QAbstractItemDelegate):

    • 委托类负责渲染和编辑数据项目。
    • 常见的委托类有 QItemDelegateQStyledItemDelegate 等。
    • 委托类负责决定如何显示和编辑数据项目,如文本、图标、下拉框等。
    • 委托类还负责处理用户输入,并将编辑后的数据返回给模型类。

 

下面是一个具体的例子:

假设您有一个 QTableView 显示员工信息,包括名字、年龄、工资等。

  1. 您创建一个 QStandardItemModel 作为数据模型,存储员工信息。
  2. 将 QTableView 的模型设置为上述数据模型。
  3. 您可以创建一个自定义的 QItemDelegate 子类,负责渲染和编辑员工信息。
    • 例如,对于年龄字段,您可以使用一个 QSpinBox 编辑器;对于工资字段,您可以使用一个 QDoubleSpinBox 编辑器。
  4. 将自定义的委托类设置到 QTableView 上,这样就可以使用您定制的渲染和编辑行为了。

 

开发目标:

自定义模型

详细主要代码和运行测试

main

#include "mainwindow.h"
#include"modleextend.h"
#include <QApplication>
#include<QTableView>
int main(int argc, char *argv[])
{QApplication a(argc, argv);modleextend modle;QTableView view;view.setModel(&modle);view.setWindowTitle("ModelExtended模型扩展--测试操作");view.resize(500,300);view.show(); // 显示表视图return a.exec();
}

自定义模型扩展类

#ifndef MODLEEXTEND_H
#define MODLEEXTEND_H#include<QAbstractTableModel>
//自定义数据模型
class modleextend : public QAbstractTableModel
{
public://自定义数据模型explicit modleextend(QObject *parent = 0);
public:// 系统自的model相关的函数进行重新定义virtual int rowCount(const QModelIndex &parent=QModelIndex()) const; // 行virtual int columnCount(const QModelIndex &parent=QModelIndex()) const; // 列virtual QVariant data(const QModelIndex &index,int role) const; // 显示数据virtual QVariant headerData(int section,Qt::Orientation orientateion,int role) const; // 设置表头数据
private:QVector<short> index;QVector<short> id;QMap<short,QString> id_index;QMap<short,QString> name_index;QStringList view_title;
};#endif // MODLEEXTEND_H

详细实现

#include "modleextend.h"modleextend::modleextend(QObject *parent):QAbstractTableModel(parent)
{id_index[1]="2022001";id_index[2]="2022002";id_index[3]="2022003";id_index[4]="2022004";id_index[5]="2022005";name_index[1]="张三";name_index[2]="李四";name_index[3]="王五";name_index[4]="刘山";name_index[5]="张平";index<<1<<2<<3<<4<<5;view_title<<"员工号"<<"姓名";
}
int modleextend::rowCount(const QModelIndex &parent) const {return index.size();
}int modleextend::columnCount(const QModelIndex &parent) const {return view_title.size();
}// 显示数据  index 参数指定了要查询的单元格位置,role 参数指定了要获取的数据的角色
QVariant modleextend::data(const QModelIndex &index,int role) const{if(!index.isValid())return QVariant();//检查了角色是否为Qt::DisplayRole(即数据显示角色)。这个角色通常用于返回需要显示在视图中的文本数据。if(role==Qt::DisplayRole){switch (index.column()) {case 0:return id_index[this->index[index.row()]];break;case 1:return name_index[this->index[index.row()]];break;default:return QVariant();}}
}// 返回表头数据 index 参数指定了要查询的行或列索引,orientation 参数指定了表头的方向(水平或垂直),role 参数指定了要获取的数据的角色。
QVariant modleextend::headerData(int index,Qt::Orientation orientateion,int role) const{if(role==Qt::DisplayRole && orientateion==Qt::Horizontal)return view_title[index];//调用父类QAbstractTableModel的headerData()函数,让父类来处理表头数据的返回。return QAbstractTableModel::headerData(index,orientateion,role);}

 总结:

模型抽象理解成磨具,视图则是往磨具注入数据的程序效果,当与视图互动时,代理作为解耦磨具和数据。

最后附上源代码链接
对您有帮助的话,帮忙点个star

21-model-view-delegate · jbjnb/Qt demo - 码云 - 开源中国 (gitee.com)

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【Python系列】数字的bool值

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

Java | Leetcode Java题解之第218题天际线问题

题目&#xff1a; 题解&#xff1a; class Solution {public List<List<Integer>> getSkyline(int[][] buildings) {PriorityQueue<int[]> pq new PriorityQueue<int[]>((a, b) -> b[1] - a[1]);List<Integer> boundaries new ArrayList&l…

Spring Boot Vue 毕设系统讲解1

项目结构 包说明 db&#xff1a;文件夹是存放数据脚本文件的 annotation&#xff1a; 系统自定义注解 config&#xff1a;系统定义的配置类 controller&#xff1a; 系统接口控制器类 dao&#xff1a; 系统dao类编写数据库查询方法和数据库交互 entity&#xff1a;数据库…

Fastapi 项目第二天首次访问时数据库连接报错问题Can‘t connect to MySQL server

问题描述 Fastapi 项目使用 sqlalchemy 连接的mysql 数据库&#xff0c;每次第二天首次访问数据库相关操作&#xff0c;都会报错&#xff1a;sqlalchemy.exc.OperationalError: (pymysql.err.OperationalError) (2003, “Can’t connect to MySQL server on ‘x.x.x.x’ ([Err…

C++deque容器

文章目录 deque容器概念deque操作deque对象的带参数构造deque头部和末尾的添加移除操作deque的数据存取deque与迭代器deque赋值deque插入deque删除 deque容器概念 deque是双端数组&#xff0c;而vector是单端的。 deque头部和尾部添加或移除元素都非常快速, 但是在中部安插元…

ceph-volume inventory KeyError: ‘TYPE‘ 处理

是否有人跟我一样碰到这样的情况 执行ceph-volume inventory报错 还好有错误日志可以看 [2024-07-05 11:40:40,540][ceph_volume.process][INFO ] Running command: /usr/sbin/blkid -c /dev/null -p /dev/ceph-c5fd6684-3851-49ab-bd44-f6743a79e24f/osd-block-42d41cd1-82…

爬虫进阶:Selenium与Ajax的无缝集成

爬虫与Ajax的挑战 Ajax&#xff08;Asynchronous JavaScript and XML&#xff09;允许网页在不重新加载整个页面的情况下与服务器交换数据并更新部分内容。这为用户带来了更好的体验&#xff0c;但同时也使得爬虫在抓取数据时面临以下挑战&#xff1a; 动态内容加载&#xff…

伪元素content追加文字使用小技巧

E::before和E::after本身的作用是追加字&#xff0c;直接在文字后面追加链接 <!DOCTYPE html> <html lang"zh-cn"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-sca…

使用myCobot280和OAK-D OpenCV DepthAI摄像头制作一个实时脸部跟踪的手机支架!

引言 由于YouTube和Netflix的出现&#xff0c;我们开始躺着看手机。然而&#xff0c;长时间用手拿着手机会让人感到疲劳。这次我们制作了一个可以在你眼前保持适当距离并调整位置的自动移动手机支架&#xff0c;让你无需用手拿着手机。请务必试试&#xff01; 准备工作 这次我们…

bpftrace几种使用实例

1. 排查内存泄漏 memory.c memory.bt 可以执行相关memory&#xff0c;用bpftrace追踪malloc和free的过程 修改memory.bt&#xff0c;加上malloc和free统计&#xff0c;重新执行 2. 验证tcp连接关闭是应用关闭还是内核关闭 nginx服务启动后&#xff0c;会处于监听状态&…

1999-2022年企业持续绿色创新水平数据

企业持续绿色创新水平数据为研究者提供了评估企业在绿色技术领域创新持续性和能力的重要视角。以下是对企业持续绿色创新水平数据的介绍&#xff1a; 数据简介 定义&#xff1a;企业持续绿色创新水平反映了企业在一定时期内绿色专利申请的持续性和创新能力。计算方法&#xf…

Redis 多数据源 Spring Boot 实现

1.前言 本文为大家提供一个 redis 配置多数据源的实现方案&#xff0c;在实际项目中遇到&#xff0c;分享给大家。后续如果有时间会写一个升级版本&#xff0c;升级方向在第5点。 2.git 示例地址 git 仓库地址&#xff1a;https://github.com/huajiexiewenfeng/redis-multi-…

Cesium 二三维热力图

Cesium 二三维热力图 原理&#xff1a;主要依靠heatmap.js包来实现 效果图&#xff1a;

昇思25天学习打卡营第18天|Pix2Pix实现图像转换

Pix2Pix概述 Pix2Pix是基于条件生成对抗网络实现的一种深度学习图像转换模型。Pix2Pix是将cGAN应用于有监督的图像到图像翻译&#xff0c;包括生成器和判别器。 基础原理 cGAN的生成器是将输入图片作为指导信息&#xff0c;由输入图像不断尝试生成用于迷惑判别器的“假”图像…

【JavaSE】异常(Exception)

目录 异常是什么异常的分类异常的处理方法throw抛出异常异常的声明异常的捕获和处理finally 自定义异常类 异常是什么 异常就是程序在进行时的不正常行为&#xff0c;就像之前数组时会遇到空指针异常&#xff08;NullPointerException&#xff09;&#xff0c;数组越界异常&am…

lua入门(1) - 基本语法

本文参考自&#xff1a; Lua 基本语法 | 菜鸟教程 (runoob.com) 需要更加详细了解的还请参看lua 上方链接 交互式编程 Lua 提供了交互式编程模式。我们可以在命令行中输入程序并立即查看效果。 Lua 交互式编程模式可以通过命令 lua -i 或 lua 来启用&#xff1a; 如下图: 按…

用Python轻松转换PDF为CSV

数据的可访问性和可操作性是数据管理的核心要素。PDF格式因其跨平台兼容性和版面固定性&#xff0c;在文档分享和打印方面表现出色&#xff0c;尤其适用于报表、调查结果等数据的存储。然而&#xff0c;PDF的非结构化特性限制了其在数据分析领域的应用。相比之下&#xff0c;CS…

Golang | Leetcode Golang题解之第218题天际线问题

题目&#xff1a; 题解&#xff1a; type pair struct{ right, height int } type hp []pairfunc (h hp) Len() int { return len(h) } func (h hp) Less(i, j int) bool { return h[i].height > h[j].height } func (h hp) Swap(i, j int) { h[i], h[j]…

python: create Envircomnet in Visual Studio Code 创建虚拟环境

先配置python开发环境 1.在搜索栏输入“>" 或是用快捷组合键ctrlshiftP键 就会显示”>",再输入"python:" 选择已经安装好的python的版本,选定至当前项目中&#xff0c;都是按回车 就可以看到创建了一个虚拟环境的默认的文件夹名".venv" 2 …