Qt 模型视图编程之表头设置

news2025/1/19 10:19:23

背景

Qt 模型视图编程中模型定义了标准接口对数据进行访问,可根据需求继承对应的抽象模型类来实现自定义的数据模型。一个基本的数据模型至少要实现以下虚函数:
①.rowCount:行数,返回要显示多少行;
②.columnCount:列数,返回要显示多少列
③.data:读取数据,返回每个单元格要显示的内容
视图不会主动更新数据的显示,模型使用 dataChanged 信号通知视图数据发生变化。

表头相关接口

①.概述
在视图界面中除了显示数据外,还包含了横向、纵向两个表头的显示;在数据模型中也提供了对表头进行设置的接口。
②.关键虚函数
headerData:数据模型对外提供的获取表头显示内容的接口;
setHeaderData:数据模型对外提供的可设置表头的内容的接口。
③.表头更新信号
headerDataChanged:表头内容更新信号,通知界面更新显示。
④.默认表头内容
横向和纵向表头默认值显示为对应的行号和列号,从 1 开始;当不需自定义表头内容时,直接调用基类的方法返回其默认实现即可。

设置模型表头内容

①.概述
一般在用于数据显示时其表头内容在初始化时设定好即可,通常无需变动。
②.TableModelDemo.h 文件

#include <QAbstractTableModel>struct student
{
  QString name;
  int age;
  QString sex;
};//测试用数据结构
Q_DECLARE_METATYPE(student)class TableModelDemo : public QAbstractTableModel
{
  Q_OBJECT
​
public:
  TableModelDemo(QList<student> & list, QList<QString> & headers, QObject *parent = nullptr):QAbstractTableModel(parent),m_list(list),m_header(headers){};
  ~TableModelDemo() {};
public:
  int rowCount(const QModelIndex &parent) const override { return m_list.size(); }//行数
  int columnCount(const QModelIndex &parent) const override { return  m_header.size(); }//列数
  QVariant data(const QModelIndex &index,int role) const override;//
  Qt::ItemFlags flags(const QModelIndex &index)const override;//
  bool setData(const QModelIndex &index,const QVariant & value, int role = Qt::EditRole)  override;//
  bool insertRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;//  
  bool removeRows(int row, int count, const QModelIndex &parent = QModelIndex()) override;//
  QVariant headerData(int section, Qt::Orientation orientation, int role  = Qt::DisplayRole) const override;//获取表头
private:
  QList<student> &m_list;//对内存中数据的引用
  QList<QString> m_header;//表头内容
public:
  void setCustomData(QList<student> & l);
  void setHeaderData(QList<QString> & headers);
  
};

③.TableModelDemo.cpp 文件

QVariant TableModelDemo::headerData(int section, Qt::Orientation orientation, int role /*= Qt::DisplayRole*/) const
{
  if (orientation == Qt::Horizontal)//只更改横向表头
  {
    switch (role)
    {
    case Qt::DisplayRole:
      return m_header[section];
    default:
      break;
    }
  }
  return QAbstractTableModel::headerData(section, orientation, role);//返回默认实现
}

④.数据模型初始化

student s;
s.age = 18;
s.name = "张三";
s.sex = "男";
m_list.append(s);
​
s.age = 16;
s.name = "李四";
s.sex = "女";
m_list.append(s);
​
QList<QString> m_header{ "姓名","年龄","性别" };
auto mode = new TableModelDemo(m_list, m_header);
​
ui.tableView->setModel(mode);

在这里插入图片描述

更改模型表头内容

①.更改单个表头内容

通过 setHeaderData 可以设置单个表头内容的显示,并通过信号通知视图刷新显示:

bool TableModelDemo::setHeaderData(int section, Qt::Orientation orientation, const QVariant &value, int role /*= Qt::EditRole*/)
{
  if (orientation == Qt::Horizontal)
  {
    m_header[section] = value.toString();
​
    emit headerDataChanged(orientation, section, section);return true;
  }
  return false;
}

在这里插入图片描述

②.更改整个表头内容

当视图关联的模型变更时,通常也需要对其表头内容进行对应更改:

void TableModelDemo::setCustomData(QList<student> & l)
{
  int m_rowCount = rowCount(QModelIndex());
  int m_colCount = columnCount(QModelIndex());
​
  m_list = l;
  emit dataChanged(index(0, 0), index(m_rowCount - 1, m_rowCount - 1));
}

在这里插入图片描述

在这里插入图片描述

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

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

相关文章

Django 图书借书系统

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言 一、Django是什么&#xff1f; 二、django安装 1.安装 2.需要的pip list 安装 三、django 建立图书馆管理系统 1.建立项目 建立项目locallibrary 2.参加APP 建…

[附源码]Python计算机毕业设计高校医疗健康服务系统的设计与实现Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

java计算机毕业设计基于安卓Android的婚恋相亲app

项目介绍 网络的广泛应用给生活带来了十分的便利。所以把网上婚恋相亲系统与现在网络相结合,利用java技术建设网上婚恋相亲系统APP,实现网上婚恋相亲系统的信息化。则对于进一步提高网上婚恋相亲系统发展,丰富网上婚恋相亲系统经验能起到不少的促进作用。 网上婚恋相亲系统APP能…

气泡水位计的安装方法与安装注意事项

气泡水位计它由活塞泵产生的压缩空气流经测量管和气泡室&#xff0c;进入被测的水体中&#xff0c;测量管中的静压力与气泡室上的水位高度成正比。那么接下来就请跟随小编的脚步一起来了解下气泡水位计的安装方法与安装注意事项的相关内容。 气泡式水位计的安装方法: 1.气管安装…

JDK的使用——Java开发第一步

JDK的使用——Java开发第一步 1 什么是JDK JDK是 Java 语言的软件开发工具包&#xff0c;是整个java开发的核心&#xff0c;使用Java开发第一步就是要在计算机上安装JDK。 JDK主要包含三个部分&#xff1a; 1 JAVA开发工具(jdk\bin) 2 基础开发库(jdk\jre\lib) 3 基础开发库…

Codeforces Round #762 (Div. 3) E. MEX and Increments

https://codeforces.com/contest/1619/problem/E 翻译&#xff1a; Dmitry有一个&#x1d45b;非负整数数组&#x1d44e;1&#xff0c;&#x1d44e;2&#xff0c;…&#xff0c;&#x1d44e;&#x1d45b;。 在一次操作中&#xff0c;Dmitry可以选择任意索引&#x1d457…

SAP ABAP——数据类型(六)【预定义基本数据类型详解】

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

编译robotics_transformer

编译tensor2robot GitHub - google-research/tensor2robot: Distributed machine learning infrastructure for large-scale robotics research 2.编译proto文件为python文件 robotrobot:~/ref$ mkdir protoc_3.3 robotrobot:~/ref$ cd protoc_3.3/ robotrobot:~/ref/protoc…

三、HTTP 接口自动化测试

HTTP 接口自动化测试3.1 HttpLibrary.HTTP 库的使用安装导入3.1.1 Create Http Context3.2 RequestsLibrary 库的使用安装导入3.2.1 Create Session 和 Get Request1. Create Session2. Get Request3.2.2 Post Request3.2.3 RequestsLibrary 库的其他关键字3.3 RESTinstance 库…

RK3568平台开发系列讲解(摄像头篇)使用 Camera 的步骤

🚀返回专栏总目录 文章目录 一、使用 Camera 的步骤二、使用 SurfaceView 预览显示 Camera 数据沉淀、分享、成长,让自己和他人都能有所收获!😄 📢 本篇将介绍如何使用Camera。 一、使用 Camera 的步骤 说下 Camera 的操作步骤,后面给出实例,请结合代码理解分析: 获…

[附源码]Python计算机毕业设计高校体侧管理系统Django(程序+LW)

该项目含有源码、文档、程序、数据库、配套开发软件、软件安装教程 项目运行 环境配置&#xff1a; Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术&#xff1a; django python Vue 等等组成&#xff0c;B/S模式 pychram管理等…

Jetpack Compose中的Modifier

Modifier的基本使用 Modifier修饰符是Jetpack Compose中用来修饰组件的&#xff0c;提供常用的属性&#xff0c;写布局时几乎所有Composable组件的大部分属性都可以用Modifier 来修饰。官方在开发Compose UI时&#xff0c;最初尝试过将所有属性全部以函数参数的形式提供&#…

[附源码]Node.js计算机毕业设计高校学生宿舍管理信息系统Express

项目运行 环境配置&#xff1a; Node.js最新版 Vscode Mysql5.7 HBuilderXNavicat11Vue。 项目技术&#xff1a; Express框架 Node.js Vue 等等组成&#xff0c;B/S模式 Vscode管理前后端分离等等。 环境需要 1.运行环境&#xff1a;最好是Nodejs最新版&#xff0c;我…

10.Django大型电商项目之商品详情页——如何从数据库中获取图片地址显示图片在前端中

1.商品详情页 1.1 先搭建好基础框架 首先&#xff0c;我们应该修改跳转的点击路由在index.html中 <div class"goods-model"><div class"goods-content">{% for goods in goods_page %}<div class"good"><a href"/g…

计算机毕业设计django基于python爬虫系统

项目介绍 随着计算机多媒体技术的发展和网络的普及。采用当前流行的B/S模式以及3层架构的设计思想通过Python技术来开发此系统的目的是建立一个配合网络环境的爬虫系统的平台,这样可以有效地解决数据获取系统混乱的局面。 本文首先介绍了爬虫系统的发展背景与发展现状,然后遵…

谷歌浏览器是最容易受到攻击的

©网络研究院 不幸的是&#xff0c;那些看起来越多&#xff0c;他们发现的越多&#xff0c;这个规则总是适用的&#xff0c;除了来自体育场的无节制的欢呼声。 Windows 比 Linux 更容易受到攻击&#xff0c;因为 Chrome 比 Edge 更容易受到攻击。这也是因为它们是最受欢迎…

【大数据技术Hadoop+Spark】MapReduce之单词计数和倒排索引实战(附源码和数据集 超详细)

源码和数据集请点赞关注收藏后评论区留言私信~~~ 一、统计单词出现次数 单词计数是最简单也是最能体现MapReduce思想的程序之一&#xff0c;可以称为MapReduce版“Hello World。其主要功能是统计一系列文本文件中每个单词出现的次数 程序解析 首先MapReduce将文件拆分成spli…

你的代码会说话吗?(下)

篇首语 代码不讲真话的直接后果是所有人被误导了&#xff0c;然后做了一件错误的事情&#xff0c;不自知地将错就错&#xff0c;让错误越陷越深&#xff0c;最后浪费宝贵的时间。可不讲真话&#xff0c;编写代码的人又不是故意的&#xff0c;也万万不可上纲上线&#xff0c;袁…

力扣(LeetCode)1785. 构成特定和需要添加的最少元素(C++)

贪心 统计所有元素的加和 sumsumsum &#xff0c;计算 sumsumsum 到 goalgoalgoal 的距离&#xff0c;尽可能用 limitlimitlimit 的步长去走这段距离(贪心)&#xff0c;最后一步可能是 111 ~ limitlimitlimit 。 CCC 的除法是向 000 取整&#xff0c;为了统计最后一步&#xf…

深入理解网络编程精华

hi 大家好&#xff0c;我是大师兄&#xff0c;让我们一起来学习一下网络编程&#xff0c;对网络编程的核心知识进行梳理&#xff0c;希望大家早日掌握这些核心知识&#xff0c;打造自己坚实的基础。详细点击查看-> 极客星球。以上是深入理解网络编程部分ppt。感兴趣的同学可…