C++ Qt开发:TableWidget表格组件

Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍TableWidget表格组件的常用方法及灵活运用。

QTableWidget 是 Qt 中用于显示表格数据的部件。它是 QTableView 的子类,提供了一个简单的接口,适用于一些不需要使用自定义数据模型的简单表格场景。该组件可以看作是TreeWidget树形组件的高级版,表格组件相比于树结构组件灵活性更高,不仅提供了输出展示二维表格功能,还可以直接对表格元素直接进行编辑与修改操作,表格结构分为表头,表中数据两部分,表格结构可看作一个二维数组,通过数组行列即可锁定特定元素。

以下是 QTableWidget 类的一些常用方法的简要说明:

方法描述
setItem(int row, int column, QTableWidgetItem *item)设置指定行和列的项
item(int row, int column) const返回指定行和列的项
setRowCount(int rows)设置表格的行数
setColumnCount(int columns)设置表格的列数
rowCount() const返回表格的行数
columnCount() const返回表格的列数
setHorizontalHeaderLabels(const QStringList &labels)设置水平表头的标签
setVerticalHeaderLabels(const QStringList &labels)设置垂直表头的标签
setItemPrototype(QTableWidgetItem *item)设置原型项,用于在新插入的单元格中创建副本
insertRow(int row)在指定行插入新行
removeRow(int row)移除指定行
insertColumn(int column)在指定列插入新列
removeColumn(int column)移除指定列
clear()清空表格的所有内容
clearContents()清空表格的所有单元格的内容,但保留表头和行列数
itemAt(int x, int y) const返回给定坐标下的项
setCurrentItem(QTableWidgetItem *item)设置当前项,用于指定当前被选择的项
currentItem() const返回当前被选择的项
setCurrentCell(int row, int column)设置当前单元格,用于指定当前被选择的单元格
currentRow() const返回当前被选择的行号
currentColumn() const返回当前被选择的列号
setItemDelegate(QAbstractItemDelegate *delegate)设置项代理,用于自定义单元格的显示和编辑方式
setSortingEnabled(bool enable)启用或禁用排序功能
sortItems(int column, Qt::SortOrder order)对指定列进行排序
setEditTriggers(EditTriggers triggers)设置触发编辑的事件
editItem(QTableWidgetItem *item)编辑指定项的内容
openPersistentEditor(QTableWidgetItem *item)打开指定项的持久编辑器
closePersistentEditor(QTableWidgetItem *item)关闭指定项的持久编辑器
itemChanged(QTableWidgetItem *item)当项的内容发生变化时发出的信号
cellClicked(int row, int column)单元格被单击时发出的信号
cellDoubleClicked(int row, int column)单元格被双击时发出的信号

这些方法提供了对 QTableWidget 的基本操作和配置的途径。使用这些方法,你可以动态地调整表格的大小、内容,设置表头,进行排序,处理编辑触发事件等。

首先我们准备好UI界面部分,该界面包含的元素较为复杂,如果找不到这些组件可以参考文章底部的完整案例代码;

1.1 设置初始表格

如下代码演示了如何使用 QTableWidget 设置表头。

以下是关于该代码的一些解释:

  1. setHorizontalHeaderLabels 方法用于设置水平表头的标签。在这里,headerText_Row 是一个包含列标签的字符串列表,每个字符串对应一个表格列。
  2. 如果需要设置垂直表头,可以使用 setVerticalHeaderLabels 方法,将一个包含行标签的字符串列表传递给它。
  3. 可以通过循环设置表头的每个单元格的属性。在这里,使用了循环遍历列并创建一个 QTableWidgetItem,设置其字体为粗体、字体大小为8,字体颜色为黑色,然后将其设置为相应列的水平表头项。

这样,通过设置表头的不同属性,可以使表格更具可读性和美观性。

// 设置表头的实现
void MainWindow::on_pushButton_clicked()
{QTableWidgetItem *headerItem;QStringList headerText_Row,headerText_Col;headerText_Row << "姓 名" << "性 别" << "出生日期" << "民 族" << "分数" << "是否党员";//headerText_Col << "第一行" << "第二行";// 设置为水平表头ui->tableWidget->setHorizontalHeaderLabels(headerText_Row);// 设置垂直表头//ui->tableWidget->setVerticalHeaderLabels(headerText_Col);// 另一种方式: 通过循环设置ui->tableWidget->setColumnCount(headerText_Row.count());       // 列数设置为与headerText_Row的列相等for (int i=0;i<ui->tableWidget->columnCount();i++)             // 列编号从0开始{headerItem=new QTableWidgetItem(headerText_Row.at(i));      // headerText.at(i) 获取headerText的i行字符串QFont font=headerItem->font();                              // 获取原有字体设置font.setBold(true);                                         // 设置为粗体font.setPointSize(8);                                       // 设置字体大小headerItem->setTextColor(Qt::black);                        // 设置字体颜色headerItem->setFont(font);                                  // 设置字体ui->tableWidget->setHorizontalHeaderItem(i,headerItem);     // 设置表头单元格的Item}
}

如下代码演示了如何从 QSpinBox 中读取数量,并将其设置为 QTableWidget 表格的行数。

以下是关于该代码的一些解释:

  1. 通过 ui->spinBox->value() 读取 QSpinBox 中的值,即用户选择的数量。
  2. 使用 setRowCount 方法将读取到的数量设置为表格的行数。
  3. setAlternatingRowColors(true) 用于交替设置行的底色,以提高可读性。此方法在交替的行之间使用不同的颜色。

通过这样的操作,可以动态地设置表格的行数,以适应用户的需求。

// 从spinBox中读出数量,并设置TableWidget表格的行数
void MainWindow::on_pushButton_2_clicked()
{// 读取出spinBox中的数据,并将其设置到表格中ui->tableWidget->setRowCount(ui->spinBox->value());// 行的底色交替采用不同颜色ui->tableWidget->setAlternatingRowColors(true);
}

运行程序,分别点击设置表头与设置行数,此时读者会看到如下图所示的输出效果,Table表格被初始化了。

1.1 初始化表格

如下代码中的createItemsARow函数,用于为表格的一行创建各个单元格的 QTableWidgetItem

以下是对该代码的一些解释:

  1. 姓名(Name):
    • 使用 QTableWidgetItem 创建一个单元格,并将其类型设置为自定义的 MainWindow::ctName
    • 设置文本对齐格式为水平居中和垂直居中。
    • 使用 setData 方法将学号(StudID)设置为单元格的数据。
    • QTableWidgetItem 添加到表格的指定位置。
  2. 性别(Sex):
    • 使用 QTableWidgetItem 创建一个单元格,并将其类型设置为自定义的 MainWindow::ctSex
    • 根据性别设置对应的图标。
    • 设置文本对齐格式为水平居中和垂直居中。
    • QTableWidgetItem 添加到表格的指定位置。
  3. 出生日期(birth):
    • 使用 QTableWidgetItem 创建一个单元格,并将其类型设置为自定义的 MainWindow::ctBirth
    • 将日期转换为字符串,并设置为单元格的文本。
    • 设置文本对齐格式为左对齐和垂直居中。
    • QTableWidgetItem 添加到表格的指定位置。
  4. 民族(Nation):
    • 使用 QTableWidgetItem 创建一个单元格,并将其类型设置为自定义的 MainWindow::ctNation
    • 设置文本对齐格式为水平居中和垂直居中。
    • QTableWidgetItem 添加到表格的指定位置。
  5. 是否党员(isPM):
    • 使用 QTableWidgetItem 创建一个单元格,并将其类型设置为自定义的 MainWindow::ctPartyM
    • 根据是否党员设置对应的复选框状态。
    • 设置文本对齐格式为水平居中和垂直居中。
    • 设置背景颜色为黄色。
    • QTableWidgetItem 添加到表格的指定位置。
  6. 分数(score):
    • 使用 QTableWidgetItem 创建一个单元格,并将其类型设置为自定义的 MainWindow::ctScore
    • 将分数转换为字符串,并设置为单元格的文本。
    • 设置文本对齐格式为水平居中和垂直居中。
    • QTableWidgetItem 添加到表格的指定位置。

通过这样的操作,可以在表格中动态地创建一行,并设置每个单元格的内容和样式。

// 为一行的单元格创建Items行
void MainWindow::createItemsARow(int rowNo,QString Name,QString Sex,QDate birth,QString Nation,bool isPM,int score)
{QTableWidgetItem *item;QString str;uint StudID=1001;// -------------------------------------------------------// 姓名// -------------------------------------------------------// 新建一个Item 设置单元格type为自定义的MainWindow::ctNameitem=new QTableWidgetItem(Name,MainWindow::ctName);// 文本对齐格式item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);// 学号 = 基数+ 行号StudID  +=rowNo;// 设置studID为dataitem->setData(Qt::UserRole,QVariant(StudID));// 为单元格设置Itemui->tableWidget->setItem(rowNo,MainWindow::colName,item);// -------------------------------------------------------// 性别// -------------------------------------------------------QIcon icon;if (Sex=="男"){icon.addFile(":/image/boy.ico");}else{icon.addFile(":/image/girl.ico");}// 新建一个Item 设置单元格type为自定义的 MainWindow::ctSexitem=new  QTableWidgetItem(Sex,MainWindow::ctSex);item->setIcon(icon);// 为单元格设置Itemitem->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);// 为单元格设置Itemui->tableWidget->setItem(rowNo,MainWindow::colSex,item);// -------------------------------------------------------// 出生日期// -------------------------------------------------------// 日期转换为字符串str=birth.toString("yyyy-MM-dd");// 新建一个Item 设置单元格type为自定义的 MainWindow::ctBirthitem=new  QTableWidgetItem(str,MainWindow::ctBirth);// 文本对齐格式item->setTextAlignment(Qt::AlignLeft | Qt::AlignVCenter);// 为单元格设置Itemui->tableWidget->setItem(rowNo,MainWindow::colBirth,item);// -------------------------------------------------------// 民族// -------------------------------------------------------// 新建一个Item 设置单元格type为自定义的 MainWindow::ctNationitem=new  QTableWidgetItem(Nation,MainWindow::ctNation);// 文本对齐格式item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);// 为单元格设置Itemui->tableWidget->setItem(rowNo,MainWindow::colNation,item);// -------------------------------------------------------// 是否党员// -------------------------------------------------------// 新建一个Item 设置单元格type为自定义的 MainWindow::ctPartyMitem=new  QTableWidgetItem("群众",MainWindow::ctPartyM);// 文本对齐格式item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);if (isPM){item->setCheckState(Qt::Checked);}else{item->setCheckState(Qt::Unchecked);}// 设置为黄色item->setBackgroundColor(Qt::yellow);// 为单元格设置Itemui->tableWidget->setItem(rowNo,MainWindow::colPartyM,item);// -------------------------------------------------------// 分数// -------------------------------------------------------str.setNum(score);//新建一个Item 设置单元格type为自定义的 MainWindow::ctPartyMitem=new  QTableWidgetItem(str,MainWindow::ctScore);// 文本对齐格式item->setTextAlignment(Qt::AlignHCenter | Qt::AlignVCenter);// 为单元格设置Itemui->tableWidget->setItem(rowNo,MainWindow::colScore,item);
}

接着我们来看一下如何实现初始化一个表格的,首先我们需要设置好需要填充的数据,当有了这些数据以后直接调用createItemsARow函数,并传入数据,至此就可以实现创建一行,通过循环的方式则可以实现多行的创建。

如下代码用于初始化表格元素,通过循环为每一行添加学生数据。

以下是代码的主要解释:

  1. 清除内容:
    • 使用 ui->tableWidget->clearContents() 清除工作区中的内容,但不清除表格结构。
  2. 循环添加行数据:
    • 获取表格的总行数,即数据区的行数。
    • 使用循环为每一行添加学生数据。
    • 使用 QString::asprintf 格式化字符串设置学生姓名。
    • 根据行号的奇偶性设置性别,同时设置对应的图标。
    • 调用 createItemsARow 方法为某一行创建各个单元格的 QTableWidgetItem
  3. 日期处理:
    • 初始日期设定为1997年10月7日。
    • 循环中,每次添加行后,将日期加20天。
  4. 党员标志处理:
    • 使用布尔变量 isParty 表示学生是否为党员,每次取反。
    • 将党员标志设置为对应的复选框状态。

通过这样的初始化,表格会被填充上预设的学生数据,每一行包含姓名、性别、出生日期、民族、是否党员和分数等信息。

// 初始化表格元素
void MainWindow::on_pushButton_4_clicked()
{QString strName,strSex;bool isParty=false;QDate birth;birth.setDate(1997,10,7);                // 初始化一个日期ui->tableWidget->clearContents();        // 只清除工作区中的内容,不清除表格int Rows=ui->tableWidget->rowCount();    // 数据区行数// 循环添加行数据for (int i=0;i<Rows;i++){strName=QString::asprintf("学生%d",i);   // 学生姓名if ((i % 2)==0)                         // 分奇数,偶数行设置性别,及其图标strSex="男";elsestrSex="女";// 为某一行创建itemscreateItemsARow(i, strName, strSex, birth,"汉族",isParty,70);// 日期加20天birth=birth.addDays(20);isParty =!isParty;}
}

运行后,通过点击初始化表格则可以实现对Table的初始化,如下图所示;

这里我说一下插入行是如何实现的,插入时只需要通过currentRow()获取当前光标位置,接着直接调用insertRow(CurRow)新建一行空白数据,最后通过createItemsARow()向该行插入数据即可实现,同样的删除行时只需要使用removeRow()即可实现。

1.2 读数据到文本

如下代码实现了将QTableWidget中的数据读入文本框的功能。

以下是代码的主要解释:

  1. 清空文本框:
    • 使用 ui->textEdit->clear() 清空文本框内容。
  2. 循环遍历表格行:
    • 通过 ui->tableWidget->rowCount() 获取表格的行数,进行循环遍历。
  3. 逐列处理数据:
    • 使用内部循环 for (int j=0; j<ui->tableWidget->columnCount()-1; j++) 处理每一列的数据,最后一列是党员状态,需要单独处理。
    • 获取每个单元格的 QTableWidgetItem
    • 使用 cellItem->text() 获取单元格的文本内容。
    • 将每列的文本内容连接为一行字符串。
  4. 党员状态处理:
    • 获取最后一列(党员状态列)的 QTableWidgetItem
    • 使用 cellItem->checkState() 判断复选框的状态,根据状态判断是否为党员。
  5. 添加到文本框:
    • 将每一行的字符串添加到文本框中,使用 ui->textEdit->append(str)

通过这样的处理,文本框中会显示表格的内容,每一行包含每个单元格的文本内容,最后一列显示党员状态。

// 将表格中的数据读入文本框: 将QTableWidget的所有行的内容提取字符串
void MainWindow::on_pushButton_8_clicked()
{QString str;QTableWidgetItem *cellItem;// 先清空一下ui->textEdit->clear();// 循环次数为表格行数,逐行处理for(int i=0;i< ui->tableWidget->rowCount();i++){str = QString::asprintf("第 %d 行: ",i+1);    // 设置表个第0列// 逐列处理,但最后一列是check型,需要单独处理for (int j=0;j<ui->tableWidget->columnCount()-1;j++){cellItem = ui->tableWidget->item(i,j);     // 获取到单元格的Itemstr = str + cellItem->text() + " | ";      // 连接字符串}// 最后一列的党员状态,是一个选择框,要单独判断cellItem = ui->tableWidget->item(i,colPartyM);// 根据选择框的状态来单独判断if(cellItem->checkState() == Qt::Checked)str = str + "党员";elsestr = str + "群众";// 添加到编辑框作为一行// ui->textEdit->appendPlainText(str);ui->textEdit->append(str);}
}

当读者点击将表格读入文本框后则可实现表格转文本,如下图所示;

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

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

相关文章

基于python的leetcode算法介绍之递归

文章目录 零 算法介绍一 简单示例 辗转相除法Leetcode例题与思路[509. 斐波那契数](https://leetcode.cn/problems/fibonacci-number/)解题思路&#xff1a;题解&#xff1a; [206. 反转链表](https://leetcode.cn/problems/reverse-linked-list/)解题思路&#xff1a;题解&…

Jmeter中使用py插件

-安装插件 1、下载插件jython-standalone-2.7.0.jar到jmeter的lib\ext目录下 链接&#xff1a; https://pan.baidu.com/s/13ZXtUwoQEV62M98GaIR26w 提取码&#xff1a;ioyk 2、重启jmeter&#xff0c;查看是否生效&#xff0c;如果这个语言有python的选项说明可以了&#xf…

VMware虚拟机安装Linux操作系统

1.CentOS 7安装 软件选择&#xff0c;安装桌面系统 2.配置虚拟机网卡 3.连接Xshell

测试用例评审流程优化

测试用例评审是QA日常工作流程中的关键一环&#xff0c;是QA同学完善测试用例、交流测试经验的好机会。 负责组内测试用例建设以来&#xff0c;作者对于评审流程做了一些优化工作。本文作者将整个优化过程中的心得体会做了一个总结&#xff0c;希望能给大家带来帮助。 01 原始流…

Model-based value iteration and policy iteration pseudocode

Note that the symbols used in the pseudocode below have the following meanings: MDP: Markov Decision Process;V(s): Value function, the avg reture of one state;π(s): Policy, in the sense that for a given state s, π(s)represents the action that the agent …

【MySQL】 表的操作

// 创建表 create table 表名();// 查看表结构 desc 表名;// 新增一列表信息 alter table 表名 add 字段名 字段类型 (after 原表某一字段名);// 删除一列表信息 alter table 表名 drop 字段名;// 修改表字段名字 alter table 表名 change 原字段名 新字段名 类型; // 新字…

企业微信自动登录自定义系统

方法一&#xff1a;企业微信构造OAuth2链接跳转登录到自定义系统 企业微信自定义应用配置 构造网页授权链接 如果企业需要在打开的网页里面携带用户的身份信息&#xff0c;第一步需要构造如下的链接来获取code参数&#xff1a; https://open.weixin.qq.com/connect/oauth2/…

数据可视化---饼图、环形图、雷达图

类别内容导航机器学习机器学习算法应用场景与评价指标机器学习算法—分类机器学习算法—回归机器学习算法—聚类机器学习算法—异常检测机器学习算法—时间序列数据可视化数据可视化—折线图数据可视化—箱线图数据可视化—柱状图数据可视化—饼图、环形图、雷达图统计学检验箱…

【微服务】springboot整合minio详解

目录 一、前言 二、Minio 概述 2.1 Minio简介 2.1 Minio特点 三、Minio 环境搭建 3.1 部署过程 3.1.1 拉取镜像 3.1.2 启动容器 3.1.3 访问web页面 四、Minio基本使用 4.1 基本概念 4.2 上传文件演示 4.3 用户管理 4.4 Java操作Minio 4.4.1 导入依赖 4.4.2 上传…

MATLAB 平面拟合并可视化(34)

MATLAB 平面拟合并可视化(34) 一、效果二、代码一、效果 二、代码 % 生成三维点数据 x = rand(100, 1); y = rand(100, 1

Express及mongoose搭建数据库(增删改查)

express是什么&#xff1f; Express.js 是一个基于 Node.js 平台的 Web 应用程序框架&#xff0c;它旨在帮助开发者轻松构建和管理 Web 服务和应用程序。Express 提供了许多强大的功能&#xff0c;使得创建可扩展、灵活且高性能的 Web 应用变得相对容易。 安装Express步骤 确保…

棋牌的电脑计时计费管理系统教程,棋牌灯控管理软件操作教程

一、前言 有的棋牌室在计时的时候&#xff0c;需要使用灯控管理&#xff0c;在开始计时的时候打开灯&#xff0c;在结账后关闭灯&#xff0c;也有的不需要用灯控&#xff0c;只用来计时。 下面以 佳易王棋牌计时计费管理系统软件为例说明&#xff1a; 软件试用版下载或技术支…

LVS+Keepalived集群的介绍和搭建

目录 LVSKeepalived集群的介绍 Keepalived及其工作原理 Keepalived体系主要模块及其作用 一个合格的集群应该具备的特性 健康检查&#xff08;探针&#xff09;的方式 实验&#xff1a;搭建LVSKeepalived集群 实验准备 实验步骤 LVS 部署 配置节点服务器 实验验证 实…

【【UART 传输数据实验】】

UART 传输数据实验 通信方式在日常的应用中一般分为串行通信&#xff08;serial communication&#xff09;和并行通信&#xff08;parallel communication&#xff09;。 我们再来了解下串行通信的特点。串行通信是指数据在一条数据线上&#xff0c;一比特接一比特地按顺序传…

中英购物商城 中英文网店系统怎么选

中英文网店系统能帮助企业将商品卖到不同国家和地区&#xff0c;有效走出国门的工具&#xff0c;在选择中英购物商城时&#xff0c;需要考虑以下几个方面&#xff1a; 1、语言支持&#xff1a;选择一款能够支持中英文双语的购物商城系统是必要的&#xff0c;同时建议选择能确认…

数据结构--图(更新ing~)

树具有灵活性&#xff0c;并且存在许多不同的树的应用&#xff0c;但是就树本身而言有一定的局限性&#xff0c;树只能表示层次关系&#xff0c;比如父子关系。而其他的比如兄弟关系只能够间接表示。 推广--- 图 图形结构中&#xff0c;数据元素之间的关系是任意的。 一、图…

[PTA]分寝室

学校新建了宿舍楼&#xff0c;共有 n 间寝室。等待分配的学生中&#xff0c;有女生 位、男生 位。所有待分配的学生都必须分到一间寝室。所有的寝室都要分出去&#xff0c;最后不能有寝室留空。 现请你写程序完成寝室的自动分配。分配规则如下&#xff1a; 男女生不能混住&…

如何去掉视频中不想要的水印,分享几个视频去水印技巧给你

如何去掉视频中不想要的水印&#xff1f;视频中的水印往往会遮挡画面&#xff0c;降低观看体验。本文将为您介绍三种方法&#xff0c;帮助您轻松去除视频中的水印&#xff0c;以便更好地欣赏和分享视频内容。 视频去水印技巧一&#xff1a;使用水印云 是一款操作简便、功能强大…

【C语言初阶】数组

目录 一、一维数组的创建和初始化 1.1 数组的创建 1.2 数组的初始化 1.3 一维数组的使用 1.4 一维数组在内存中的存储 二、二维数组的创建和初始化 2.1 二维数组的创建 2.2 二维数组的初始化 2.3 二维数组的使用 2.4 二维数组在内存中的存储 三、数组越界 四、数组作…

智能高效的Go开发工具GoLand v2023.3发布,支持AI辅助编码!

GoLand 使 Go 代码的阅读、编写和更改变得非常容易。即时错误检测和修复建议&#xff0c;通过一步撤消快速安全重构&#xff0c;智能代码完成&#xff0c;死代码检测和文档提示帮助所有 Go 开发人员&#xff0c;从新手到经验丰富的专业人士&#xff0c;创建快速、高效、和可靠的…