【Qt开发】多元素类控件(二)-> QTableWidget - 实践

news/2025/11/15 17:10:08/文章来源:https://www.cnblogs.com/gccbuaa/p/19225845

目录

1 -> 概述

2 -> QTableWidget 核心方法

3 -> QTableWidgetItem 核心信号

4 -> QTableWidgetItem 核心方法

5 -> 丰富多样的内置控件库

6 -> 核心优势与设计哲学

7 -> 代码示例

8 -> 总结


1 -> 概述

在图形用户界面开发中,表格是展示和编辑结构化数据最直观、最高效的组件之一。Qt 框架中的 QTableWidget 便是一个强大的表格控件,它极大地简化了表格数据的显示与交互。然而,它的真正威力并不仅仅在于展示文本和图标,而在于其能将各种复杂的界面控件无缝集成到每一个单元格中,从而将一个简单的表格转变为一个高度交互、功能丰富的动态数据管理界面。

传统的表格视图往往局限于显示静态的文本和数字。而 QTableWidget 通过其核心概念——单元格控件,彻底打破了这一局限。开发者可以将任何继承自 QWidget 的控件“置入”表格的单元格中,这使得每个单元格都可以成为一个独立的、功能完备的交互单元。

这种设计哲学将表格从纯粹的数据“显示器”升级为数据的“编辑器”和“控制器”。用户不再需要跳转到额外的对话框或窗口来修改数据,他们可以直接在表格内部完成所有操作,极大地提升了应用的流畅度和用户体验。

2 -> QTableWidget 核心方法

方法说明
item(int row, int column)根据行数列数获取指定的 QTableWidgetItem*
setItem(int row, int column, QTableWidget*)根据行数列数设置表格中的元素
currentItem()返回被选中的元素 QTableWidgetItem*
currentRow()返回被选中元素是第几行
currentColumn()返回被选中元素是第几列
row(QTableWidgetItem*)获取指定 item 是第几行
column(QTableWidgetItem*)获取指定 item 是第几列
rowCount()获取行数
columnCount()获取列数
insertRow(int row)在第 row 行处插入新行
insertColumn(int column)在第 column 列插入新列
removeRow(int row)删除第 row 行
removeColumn(int column)删除第 column 列
setHorizontalHeaderItem(int column, QTableWidget*)设置指定列的表头
setVerticalHeaderItem(int row, QTableWidget*)设置指定行的表头

3 -> QTableWidgetItem 核心信号

信号说明
cellClicked(int row, int column)点击单元格时触发
cellDoubleClicked(int row, int column)双击单元格时触发
cellEntered(int row, int column)鼠标进入单元格时触发
currentCellChanged(int row, int column, int previousRow, int previousColumn)选中不同单元格时触发

4 -> QTableWidgetItem 核心方法

方法说明
row()获取当前是第几行
column()获取当前是第几列
setText(const QString&)设置文本
setTextAlignment(int)设置文本对齐
setIcon(const QIcon&)设置图标
setSelected(bool)设置被选中
setSizeHints(const QSize&)设置尺寸
setFont(const QFont&)设置字体

5 -> 丰富多样的内置控件库

QTableWidget 能够轻松容纳 Qt 提供的几乎所有基础及高级控件,为不同的数据类型和交互需求提供了完美的解决方案:

  • 文本输入与验证:使用 QLineEdit 可以允许用户输入单行文本。更进一步,您可以为其设置输入验证器,例如只允许输入数字或符合特定格式的字符串,从而在源头保证数据的有效性。

  • 布尔值选择:对于“是/否”、“真/假”这类二元数据,QCheckBox 是最佳选择。其直观的勾选状态让数据的查看和修改一目了然。

  • 枚举与列表选择:当某个单元格的值需要从一个预定义的列表中选择时,QComboBox 便派上了用场。它通过下拉列表的形式,既节省了空间,又确保了输入值的准确性和一致性,非常适合用于“状态”、“类别”等字段。

  • 数字微调:对于数值型数据,QSpinBox 和 QDoubleSpinBox 提供了精确且安全的输入方式。用户可以通过上下按钮微调数值,同时控件本身可以限制数值的范围和步进,避免了无效输入。

  • 进度可视化:在需要展示任务进度、完成百分比或任何度量值时,QProgressBar 可以直观地将数字信息转化为视觉化的条形图,让用户一眼就能把握整体情况。

  • 自定义按钮与操作:您甚至可以在单元格中嵌入 QPushButton。点击这个按钮可以触发特定的业务逻辑,例如“删除此行”、“查看详情”、“执行计算”等,将操作与数据紧密地绑定在一起。

6 -> 核心优势与设计哲学

  1. 极致的用户体验:通过将编辑控件内嵌于数据旁,实现了“就地编辑”,最大限度地减少了用户的鼠标移动和焦点切换,使数据操作变得高效而自然。

  2. 界面紧凑与高效:将所有功能和数据整合在一个视图中,避免了因弹出过多窗口而导致的界面凌乱,保持了主界面的整洁和空间利用率。

  3. 灵活性与可定制性:由于可以自定义每个单元格的控件,您可以为同一表格中不同类型的数据列设计最合适的交互方式。这种灵活性使得 QTableWidget 能够适应从简单的配置表格到复杂的企业级数据管理系统的各种场景。

  4. 与数据模型的紧密结合:虽然 QTableWidget 是一个基于项的便捷类,但它底层依然与 Qt 的模型/视图架构相连。您可以直接从这些单元格控件中获取或设置数据,并轻松地将其同步到后台的数据结构或数据库中。

7 -> 代码示例

1. 在界面上创建 QTableWidget 和四个按钮,一个输入框

注意:QTableWidget 是 QTableView 的子类,功能比 QTableView 更丰富

2. 编写 widget.cpp 构造函数,构造表格中的初始数据

#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent): QWidget(parent), ui(new Ui::Widget)
{ui->setupUi(this);// 新增行ui->tableWidget->insertRow(0);ui->tableWidget->insertRow(1);ui->tableWidget->insertRow(2);// 新增列ui->tableWidget->insertColumn(0);ui->tableWidget->insertColumn(1);ui->tableWidget->insertColumn(2);// 设置列名ui->tableWidget->setHorizontalHeaderItem(0, new QTableWidgetItem("班级"));ui->tableWidget->setHorizontalHeaderItem(1, new QTableWidgetItem("姓名"));ui->tableWidget->setHorizontalHeaderItem(2, new QTableWidgetItem("学号"));// 设置元素ui->tableWidget->setItem(0, 0, new QTableWidgetItem("计科2201"));ui->tableWidget->setItem(0, 1, new QTableWidgetItem("syh"));ui->tableWidget->setItem(0, 2, new QTableWidgetItem("22"));ui->tableWidget->setItem(1, 0, new QTableWidgetItem("计科2202"));ui->tableWidget->setItem(1, 1, new QTableWidgetItem("zzl"));ui->tableWidget->setItem(1, 2, new QTableWidgetItem("36"));ui->tableWidget->setItem(2, 0, new QTableWidgetItem("计科2202"));ui->tableWidget->setItem(2, 1, new QTableWidgetItem("yun"));ui->tableWidget->setItem(2, 2, new QTableWidgetItem("01"));
}
Widget::~Widget()
{delete ui;
}

3. 编写按钮的 slot 函数

void Widget::on_pushButton_insertRow_clicked()
{// 获取行数int rowCount = ui->tableWidget->rowCount();// 在最后一行之后新增行ui->tableWidget->insertRow(rowCount);
}
void Widget::on_pushButton_removeRow_clicked()
{// 获取到选中的行int curRow = ui->tableWidget->currentRow();// 删除选中行ui->tableWidget->removeRow(curRow);
}
void Widget::on_pushButton_insertColumn_clicked()
{// 获取列数int colCount = ui->tableWidget->columnCount();// 在最后一行之后新增行ui->tableWidget->insertColumn(colCount);// 设置列名const QString& text = ui->lineEdit->text();ui->tableWidget->setHorizontalHeaderItem(colCount, new QTableWidgetItem(text));
}
void Widget::on_pushButton_removeColumn_clicked()
{// 获取选中的列int curCol = ui->tableWidget->currentColumn();// 删除选中列ui->tableWidget->removeColumn(curCol);
}

4. 执行程序,即可完成表格的基本操作

8 -> 总结

Qt 的 QTableWidget 远不止是一个显示行列数据的简单网格。通过其强大的多元素控件支持,它成功地模糊了数据展示与数据编辑之间的界限,将一个静态的界面组件转化为一个充满活力的、应用程序与用户对话的核心舞台。当您需要在有限的空间内提供强大的数据交互能力时,充分利用 QTableWidget 的单元格控件特性,无疑是打造现代化、高效率桌面应用的一条捷径。


感谢各位大佬支持!!!

互三啦!!!

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

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

相关文章

BBS伪随机数生成器

Blum Blum Shub(BBS),由Lenore Blum、Manuel Blum和Michael Shub于1986年提出。BBS伪随机数生成器以其可证明的安全性而闻名,其安全性基于大整数分解问题的困难性 BBS生成器的数学基础 1. Blum整数 BBS生成器的核心…

[KaibaMath]1022 一道平面几何题的两种解法

本文给出一道平面几何题的两种解法。第一种解法基于初等数学,第二种则基于高等数学。(该题目的解答完成于2017年)

实用指南:从0开始了解kafka《第二篇 kafka的安装、管理和配置》

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

动态规划法

动态规划法一、按照动态规划法的求解步骤分析作业题目“数字三角形”: 1.1 根据最优子结构性质,列出递归方程式,说明方程式的定义、边界条件: 从三角形顶部出发,每次只能向下或向右下移动,最终到达底部时,找到一…

函数表达式:JavaScript中那些你不知道的优雅写法 - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

11.15模拟赛

t1 小 \(\mathrm{L}\) 有一串 \(n\) 块宝石的项链, 它可以顺时针看成一个圆环, 即第 1 块宝石与第 2 块和第 \(n\) 块宝石相邻, 第 2 块宝石与第 1 块和第 3 块宝石相邻, 以此类推。 但不幸的是, 项链的宝石破碎了。每…

2025 最新无缝钢管优质厂家推荐:国际测评认证 + 技术创新 + 全场景适配 + 服务保障综合榜单

引言 本榜单基于国际钢管行业协会(ISSF)最新测评数据编制,通过三大核心维度构建权威评价体系:技术实力(占比 40%)涵盖生产工艺先进性、定制化能力及检测设备精度;产品品质(占比 35%)依据力学性能、尺寸公差、…

西门子S7200_SMART仿真软件的使用(保姆级教程)

第一步:编写一个简单的程序用于测试 第二步:导出“.awl”格式的文件第三步:双击打开软件包里的“S7_200汉化版.exe” 第四步:输入密码“6596”并点击“确定” 第五步:选择与之对应的CPU型号 第六步:点击“程序…

2025年RS485红外线测温仪源头厂家权威推荐榜单:在线红外测温仪/20mA红外线测温仪/红外线测温仪变送器源头厂家精选

在工业自动化与智能制造的浪潮下,RS485红外测温仪因其信号传输稳定、抗干扰能力强且便于组网的优势,市场需求持续增长。选择合适的RS485接口、支持Modbus-RTU协议的红外测温仪,已成为工业现场实现可靠温度监控的关键…

P14508 猜数游戏 guess

每次通过一些特别的手法可以知道一个长度的区间内是否有东西。 那么设 \(f_i\) 为长度为 \(i\) 的区间最少花费,那么每次将其划分成两个区间,看其中需要确定一个的最小花费是什么,这是好做的(因为确定了一个区间就…

AMD Instinct MI50 通过llama.cpp 在 ROCm7.0.2上运行

关于网上传言MI50 ROCm7.0.2的性能提升了,这边做了下测试。 ROCm7.0.2安装方法: ROCm 7.0 Install for Mi50 32GB | Ubuntu 24.04 LTS : r/LocalLLaMA 这边系统使用的ubuntu22.04 ROCm安装 wget https://repo.radeon.…

如何成为高级的安卓逆向工程师 glm4.6

如何成为高级的安卓逆向工程师 glm4.6如何成为高级的安卓逆向工程师 ● Ill help you understand how to become a senior Android reverse engineer. Let me create a comprehensive roadmap for you. ● 成为高级安…

PyTorch实战(9)——从零开始实现Transformer - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

天津雅思培训机构排名2025,无老师国际/新通教育等优质机构,师资/口碑/提分率大PK

天津雅思培训机构排名2025,无老师国际/新通教育等优质机构,师资/口碑/提分率大PK随着留学申请热度的持续攀升,雅思成绩已成为学子们海外深造的“通行证”,天津地区雅思培训市场也随之蓬勃发展。专业的雅思培训机构…

2025 最新无缝钢管源头厂家推荐:国际测评认证 + 技术创新 + 全场景适配 + 服务保障综合榜单

引言 本榜单基于国际钢管行业协会(ISSF)最新测评数据编制,通过三大核心维度构建权威评价体系:技术实力(占比 40%)涵盖生产工艺先进性、定制化能力及检测设备精度;产品品质(占比 35%)依据力学性能、尺寸公差、…

用HBuilder建立查询天气的网页

查询天气.container { max-width: 500px; margin: 50px auto; padding: 20px; border: 1px solid rgba(221, 221, 221, 1); border-radius: 10px } .input-group { margin-bottom: 20px } input { padding: 8px; width…

2025 11 15

第23场弘文了这场我T1都没切,我考虑枚举排列和起点之后,我不知道为什么就没有去想把在A中的B和在B中的A率先交换,以及在A中的C和在C中的A交换,然后再算B,C的,理由应该归咎于状态问题加上没有充分思考,因为一开始…

常用设计模式:职责链模式

根据 ChatGPT 的描述, 后端项目中出现频率最高的前 6 名设计模式是:排名 模式 典型应用🥇 1 单例模式 数据库连接、缓存客户端、全局配置🥈 2 工厂模式 动态加载不同实现(如多租户、支付、存储)🥉 3 代理模式…

fanuc 双安检实验指导书

实验:双安检功能实验学时:2~3学时实验目的与要求了解并掌握双安检功能原理以及应用,通过该功能的学习能够确保信号输入输出的正确性、保证机床处于准确的安全位置以及定期进行安全测试。实验内容双安检功能硬件连接…

Rust RefCell 多线程读为什么也panic了?

Rust RefCell 多线程读为什么也panic了?这是最近实战中遇到的一个小知识点,没理解之前觉得「不可能」,反应过来之后,觉得自己很蠢🤣,借本文记录下。 看一段复现代码: struct MyRefCell<T>(RefCell<T&…