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

2023-12-19 11:36

本文主要是介绍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);}
}

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

这篇关于C++ Qt开发:TableWidget表格组件的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/512012

相关文章

JS常用组件收集

收集了一些平时遇到的前端比较优秀的组件,方便以后开发的时候查找!!! 函数工具: Lodash 页面固定: stickUp、jQuery.Pin 轮播: unslider、swiper 开关: switch 复选框: icheck 气泡: grumble 隐藏元素: Headroom

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

【C++ Primer Plus习题】13.4

大家好,这里是国中之林! ❥前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家。点击跳转到网站。有兴趣的可以点点进去看看← 问题: 解答: main.cpp #include <iostream>#include "port.h"int main() {Port p1;Port p2("Abc", "Bcc", 30);std::cout <<

C++包装器

包装器 在 C++ 中,“包装器”通常指的是一种设计模式或编程技巧,用于封装其他代码或对象,使其更易于使用、管理或扩展。包装器的概念在编程中非常普遍,可以用于函数、类、库等多个方面。下面是几个常见的 “包装器” 类型: 1. 函数包装器 函数包装器用于封装一个或多个函数,使其接口更统一或更便于调用。例如,std::function 是一个通用的函数包装器,它可以存储任意可调用对象(函数、函数

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

C++11第三弹:lambda表达式 | 新的类功能 | 模板的可变参数

🌈个人主页: 南桥几晴秋 🌈C++专栏: 南桥谈C++ 🌈C语言专栏: C语言学习系列 🌈Linux学习专栏: 南桥谈Linux 🌈数据结构学习专栏: 数据结构杂谈 🌈数据库学习专栏: 南桥谈MySQL 🌈Qt学习专栏: 南桥谈Qt 🌈菜鸡代码练习: 练习随想记录 🌈git学习: 南桥谈Git 🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈🌈�

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

如何在页面调用utility bar并传递参数至lwc组件

1.在app的utility item中添加lwc组件: 2.调用utility bar api的方式有两种: 方法一,通过lwc调用: import {LightningElement,api ,wire } from 'lwc';import { publish, MessageContext } from 'lightning/messageService';import Ca