【Qt笔记】QTableWidget控件详解
目录
引言
一、QTableWidget的特点
二、QTableWidget基础
2.1 引入QTableWidget
2.2 基本属性
三、代码示例:初始化QTableWidget
四、编辑功能
4.1 设置单元格为只读
4.2 响应内容更改
五、选择模式
六、样式定制
七、与其他控件的交互
7.1 在单元格中嵌入控件
八、高级功能
8.1 数据表示与编辑
8.2 表格操作
8.3 表头管理
8.4 排序与搜索
8.5 拖放功能
九、应用示例
9.1 代码
9.1.1 头文件
9.1.2 main函数文件
9.2 实现效果
9.3 注意
结语
引言
QTableWidget是Qt框架中的一个重要控件,用于展示和编辑二维表格数据。它基于QTableView和QStandardItemModel的封装,但提供了更为简便的接口,使得处理常见的表格操作需求变得更加容易。以下是对QTableWidget控件的详细解析,内容涵盖其特点、数据表示、初始化与数据填充、编辑功能、表头管理、选择模式、样式定制、信号与槽机制以及与其他控件的交互等方面。
一、QTableWidget的特点
- 二维数据表示:QTableWidget以行和列的形式组织数据,每个单元格由一个QTableWidgetItem对象表示,可以包含文本、图标或其他数据类型。
- 简单易用:相比QTableView,QTableWidget提供了更多的直接操作方法,如插入、删除行或列,以及直接访问和修改单元格内容。
- 编辑功能:用户可以直接在表格中编辑单元格内容,支持文本编辑、复选框、按钮等多种编辑模式。
- 表头管理:可以自定义行列表头,行列表头默认是不可编辑的,用于标识各列或行的数据含义。
- 选择模式:支持多种选择模式,如单选、多选、行选或列选等。
- 样式定制:可以通过设置样式表来改变QTableWidget的外观,包括单元格颜色、字体、边框等。
- 信号与槽机制:QTableWidget支持Qt的信号与槽机制,可以轻松地响应用户交互,如单元格点击、内容改变等事件。
二、QTableWidget基础
2.1 引入QTableWidget
要使用QTableWidget,首先需要在Qt项目中包含相应的头文件,并在UI设计中或在代码中创建其实例。
#include <QTableWidget> // 在Qt Designer中,可以直接通过拖放QTableWidget到窗体上
// 或者在代码中动态创建
QTableWidget *tableWidget = new QTableWidget(this); // 假设当前是在某个QWidget或QMainWindow的构造函数中
2.2 基本属性
- 行数(RowCount) 和 列数(ColumnCount):可以通过setRowCount()和setColumnCount()设置。
- 单元格(Cell):通过setItem(int row, int column, QTableWidgetItem *item)设置。
- 表头(Header):分为水平表头(列表头)和垂直表头(行表头),可通过setHorizontalHeaderLabels()和setVerticalHeaderLabels()设置标签,或通过setHorizontalHeaderItem()和setVerticalHeaderItem()设置更复杂的表头项。
三、代码示例:初始化QTableWidget
以下是一个简单的示例,展示了如何创建一个包含几行几列的QTableWidget,并设置一些单元格的文本。
#include <QApplication>
#include <QTableWidget>
#include <QTableWidgetItem> int main(int argc, char *argv[]) { QApplication app(argc, argv); QTableWidget tableWidget(4, 3); // 创建一个4行3列的表格 tableWidget.setHorizontalHeaderLabels(QStringList() << "姓名" << "年龄" << "职业"); // 设置水平表头 // 设置一些单元格的文本 QTableWidgetItem *item = new QTableWidgetItem("张三"); tableWidget.setItem(0, 0, item); tableWidget.setItem(0, 1, new QTableWidgetItem("30")); tableWidget.setItem(0, 2, new QTableWidgetItem("软件工程师")); // ... 为其他单元格设置文本(省略) tableWidget.show(); return app.exec();
}
四、编辑功能
QTableWidget的单元格默认是可编辑的(除非设置了只读属性)。用户可以直接在单元格中输入文本,或者通过编程方式更改单元格内容。
4.1 设置单元格为只读
item->setFlags(item->flags() & ~Qt::ItemIsEditable);
4.2 响应内容更改
可以连接itemChanged(QTableWidgetItem *item)信号来响应单元格内容的更改。
connect(&tableWidget, &QTableWidget::itemChanged, [&](QTableWidgetItem *item) { qDebug() << "单元格内容已更改:" << item->text();
});
五、选择模式
QTableWidget支持多种选择模式,如单选、多选、行选或列选等。
tableWidget.setSelectionMode(QAbstractItemView::SingleSelection); // 单选
// 或
tableWidget.setSelectionMode(QAbstractItemView::MultiSelection); // 多选
// 等
六、样式定制
通过样式表(StyleSheet),可以灵活地定制QTableWidget的外观,包括字体、颜色、边框等。
tableWidget.setStyleSheet("QTableWidget { selection-background-color: #3399ff; }" "QTableWidget QTableCornerButton::section { background-color: #ccc; }");
七、与其他控件的交互
QTableWidget可以与其他Qt控件进行交互,例如通过按钮操作表格数据,或在表格单元格中嵌入其他控件(如QComboBox、QPushButton等)。
7.1 在单元格中嵌入控件
QPushButton *button = new QPushButton("点击我");
tableWidget.setCellWidget(row, column, button);
connect(button, &QPushButton::clicked, [=]() { // 处理按钮点击事件
});
八、高级功能
QTableWidget 是 Qt 框架中的一个功能强大的表格控件,用于展示和编辑二维表格数据。它继承自 QTableView 并提供了更为简便的接口来处理常见的表格操作需求。以下是 QTableWidget 的一些高级功能详细介绍:
8.1 数据表示与编辑
- 数据组织:QTableWidget 以行和列的形式组织数据,每个单元格由一个 QTableWidgetItem 对象表示,可以包含文本、图标或其他数据类型。
- 编辑功能:用户可以直接在表格中编辑单元格内容,支持文本编辑、复选框、按钮等多种编辑模式。开发者可以通过设置 QTableWidgetItem 的 flags 属性来控制单元格的编辑性。
8.2 表格操作
- 动态管理行列:支持在运行时动态地添加、删除行或列。使用 insertRow()、insertColumn() 方法添加行或列,使用 removeRow()、removeColumn() 方法删除行或列。
- 初始化与填充数据:可以通过构造函数创建一个空的表格,并使用 setItem() 方法填充单元格数据。也可以通过 setRowCount() 和 setColumnCount() 方法设置表格的初始行数和列数。
8.3 表头管理
- 自定义表头:可以自定义行和列的表头,用于标识各列或行的数据含义。表头默认是不可编辑的,但可以通过设置 QTableWidgetItem 的属性来改变其显示内容。
- 表头样式:可以设置表头的对齐方式、字体、背景色等样式,以增强表格的可读性和美观性。
8.4 排序与搜索
- 排序功能:支持对列数据进行排序,用户可以通过点击列头来按该列的数据进行升序或降序排序。
- 搜索功能:虽然 QTableWidget 本身没有直接的搜索方法,但可以通过遍历表格中的单元格并使用 QTableWidgetItem 的 text() 方法来获取单元格内容,从而实现搜索功能。
8.5 拖放功能
- 拖放支持:QTableWidget 支持单元格的拖放操作,通过设置 dragDropMode、安装事件过滤器及启用 dragEnabled 等属性,可以实现单元格之间的数据拖放。
九、应用示例
9.1 代码
这里为了显示简洁,将类的成员函数的实现也放在了头文件
9.1.1 头文件
#include <QApplication>
#include <QMainWindow>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QPushButton>
#include <QLineEdit>
#include <QHeaderView>
#include <QMessageBox>class MainWindow : public QMainWindow {Q_OBJECTpublic:MainWindow(QWidget *parent = nullptr) : QMainWindow(parent) {// 设置UIsetupUi();// 填充初始数据populateTable();}private slots:void addRow() {int rowCount = tableWidget->rowCount();tableWidget->insertRow(rowCount);for (int column = 0; column < tableWidget->columnCount(); ++column) {QTableWidgetItem *item = new QTableWidgetItem(QString("新数据%1-%2").arg(rowCount + 1).arg(column + 1));tableWidget->setItem(rowCount, column, item);}}void removeRow() {int currentRow = tableWidget->currentRow();if (currentRow != -1) {tableWidget->removeRow(currentRow);} else {QMessageBox::warning(this, "错误", "请先选择一行以删除。");}}void searchTable(const QString &searchText) {for (int row = 0; row < tableWidget->rowCount(); ++row) {bool showRow = false;for (int column = 0; column < tableWidget->columnCount(); ++column) {QTableWidgetItem *item = tableWidget->item(row, column);if (item && item->text().contains(searchText, Qt::CaseInsensitive)) {showRow = true;break;}}tableWidget->setRowHidden(row, !showRow);}}// 排序函数(简单示例,仅按第一列排序)void sortTable() {// 注意:这里只是简单调用QTableWidget的sortItems,并不使用代理模型tableWidget->sortItems(0, Qt::AscendingOrder);}private:void setupUi() {// 设置窗口标题this->setWindowTitle("QTableWidget控件例子");// 设置主窗口的中心部件QWidget *centralWidget = new QWidget(this);setCentralWidget(centralWidget);// 创建 QTableWidgettableWidget = new QTableWidget(this);tableWidget->setRowCount(0); // 初始不设置行,动态添加tableWidget->setColumnCount(3);tableWidget->setHorizontalHeaderLabels(QStringList() << "姓名" << "年龄" << "职业");// 创建添加和删除按钮QPushButton *addRowButton = new QPushButton("添加行", centralWidget);QPushButton *removeRowButton = new QPushButton("删除行", centralWidget);// 创建搜索框QLineEdit *searchLineEdit = new QLineEdit(centralWidget);searchLineEdit->setPlaceholderText("请输入要搜索的内容...");// 创建排序按钮(这里仅作为示例,实际排序可以通过点击表头实现)QPushButton *sortButton = new QPushButton("排序", centralWidget);// 布局管理QVBoxLayout *layout = new QVBoxLayout(centralWidget);layout->addWidget(searchLineEdit);layout->addWidget(tableWidget);layout->addWidget(addRowButton);layout->addWidget(removeRowButton);layout->addWidget(sortButton);// 连接信号和槽connect(addRowButton, &QPushButton::clicked, this, &MainWindow::addRow);connect(removeRowButton, &QPushButton::clicked, this, &MainWindow::removeRow);connect(searchLineEdit, &QLineEdit::textChanged, this, &MainWindow::searchTable);connect(sortButton, &QPushButton::clicked, this, &MainWindow::sortTable);// 启用拖拽tableWidget->setDragEnabled(true);tableWidget->setAcceptDrops(true);tableWidget->setDropIndicatorShown(true);// 设置窗口大小resize(600, 400);}void populateTable() {// 示例:添加几行初始数据for (int i = 0; i < 5; ++i) {addRow(); // 使用前面定义的addRow函数添加行for (int j = 0; j < 3; ++j) {QTableWidgetItem *item = new QTableWidgetItem(QString("数据%1-%2").arg(i+1).arg(j+1));tableWidget->setItem(i, j, item);}}}QTableWidget *tableWidget;
};
9.1.2 main函数文件
int main(int argc, char *argv[]) {QApplication app(argc, argv);MainWindow window;window.show();return app.exec();
}
9.2 实现效果
9.3 注意
- QTableWidget不支持通过代理模型(如QSortFilterProxyModel)进行搜索过滤,因此这里通过遍历表格项并隐藏不符合条件的行来实现搜索功能。
- 拖放功能在QTableWidget中是基本支持的,但复杂的拖放逻辑(如跨表格或跨应用程序)需要自定义处理。
- 当表格中的数据量很大时,频繁地隐藏和显示行可能会对性能产生影响。在这种情况下,考虑使用更高效的数据结构和视图控件(如QTableView与QAbstractTableModel)。
- 排序:示例中提供了一个简单的排序函数,它仅根据第一列进行排序。QTableWidget自带的sortItems方法足以应对简单排序需求。
- 在实际应用中,可能需要添加更多的错误检查和用户反馈机制,以提高应用的健壮性和用户体验。
结语
QTableWidget是Qt中一个功能强大的控件,用于展示和操作二维表格数据。它提供了丰富的接口和功能,包括数据表示、编辑功能、表头管理、选择模式、样式定制等。通过合理使用QTableWidget,可以高效地实现各种表格相关的需求,为应用程序提供直观、友好的用户界面。然而,在处理大量数据时,可能需要考虑使用更高效的模型/视图架构。
以上就是关于Qt中QTableWidget的全部介绍,如有不足与缺陷之处,欢迎评论区留言!!!
相关文章:

【Qt笔记】QTableWidget控件详解
目录 引言 一、QTableWidget的特点 二、QTableWidget基础 2.1 引入QTableWidget 2.2 基本属性 三、代码示例:初始化QTableWidget 四、编辑功能 4.1 设置单元格为只读 4.2 响应内容更改 五、选择模式 六、样式定制 七、与其他控件的交互 7.1 在单元格…...

高低压配电系统中电弧光的危害有多大?
摘要 故障电弧是一种常见的电气故障现象,尤其在配电系统中,可能对设备安全和电力供应造成严重影响。本文旨在探讨故障电弧对配电系统的危害,并提出相应的预防措施,以增强系统的可靠性和安全性。通过对故障电弧的形成机制、危害分…...

安宝特案例 | AR如何大幅提升IC封装厂检测效率?
前言:如何提升IC封装厂检测效率? 在现代电子产品的制造过程中,IC封装作为核心环节,涉及到复杂处理流程和严格质量检测。这是一家专注于IC封装的厂商,负责将来自IC制造商的晶圆进行保护、散热和导通处理。整个制程繁琐…...

QGIS 如何连接空间库,并实时编辑空间表?编辑后库表如何刷新,保证是最新数据?
文章目录 一、什么是 qgis?二、qgis 如何连接数据库三、实时编辑空间表四、编辑后库表如何刷新,保证是最新数据?五、总结 一、什么是 qgis? QGIS(原称Quantum GIS)是一个用户界面友好的开源桌面端软件&…...

CleanClip for mac(苹果电脑剪切板管理器)
CleanClip 是一款为 Mac 设计的强大剪贴板管理工具,它能够显著提升你的工作效率和生产力。无论是在日常办公中还是进行创意设计,CleanClip 都能帮助你更轻松地管理和使用剪贴板内容。让我们一起来探索一下这个功能丰富的软件吧! 下载地址&am…...

嵌入式栈溢出怎么办?
在写文件的时候,因为把FATFS这些数据结构定义在了函数里,所以栈溢出了,我把比较大的数据结构放在全局变量上,就没事了.目前仅测试阶段,也可以放在堆里.不用的时候释放掉,减少耦合度.或者加static....

工厂安灯系统在优化生产流程上的优势
工厂安灯系统通过可视化的方式,帮助工厂管理者和操作工人及时了解生产状态,快速响应问题,从而优化生产流程。 一、安灯系统实时监控与反馈 安灯系统的核心功能是实时监控生产线的状态。通过在生产现场设置灯光、显示屏等设备,工人…...
【Kubernetes】(K8S)彻底卸载详细教程
以下全部操作都是使用root用户进行(非root用户可以使用sudo),并且全部命令都需要在Kubernetes集群的所有节点分别执行: 第一步、停止K8S 所有节点执行: 1 2 3 systemctl stop kubelet systemctl stop etcd systemct…...

web基础之文件上传
1.下载安装 下载地址 链接:百度网盘-链接不存在 提取码:jhks 安装 直接把他放在phpstudy的WWW目录中。(phpstudy的下载安装,可以自行百度一下) 打开 访问地址:127.0.0.1/upload-labs 问题 这里可能…...

解决“找不到msvcp140.dll无法继续执行代码”问题:技术困境与解决方案
在现代计算机技术的发展中,软件依赖性问题日益凸显,其中“找不到msvcp140.dll无法继续执行代码”错误尤为常见。本文将从技术背景、问题成因、解决方案及预防措施四个方面,深入探讨这一技术困境,旨在为读者提供全面的理解和有效的…...

智能赋能,Vatee万腾平台助力企业升级新高度
在当今这个日新月异的数字时代,智能技术的飞速发展正以前所未有的力量重塑着各行各业的面貌。作为这一变革浪潮中的佼佼者,Vatee万腾平台凭借其卓越的智能赋能能力,正引领众多企业迈向转型升级的新高度,开启了智能化发展的新篇章。…...

ceph-radosgw 手动安装教程以及安装问题解决办法
一、环境 操作系统版本:Ubuntu20.04 x86_64 ceph版本:ceph version 15.2.17 (8a82819d84cf884bd39c17e3236e0632ac146dc4) octopus (stable) radosgw版本:15.2.17 二、ceph-radosgw 安装步骤 ceph官方英文版教程,写了个大概步骤…...
PageRank算法
一.定义-迭代算法 输入:含有 n n n个结点的有向图,转移矩阵 M M M,阻尼因子 d d d,初始向量 R 0 R_0 R0,计算精度 ϵ \epsilon ϵ 输出:有向图的PageRank向量 R R R (1)令 t 0 t0 t0 (2)计算 R t 1 d M R t 1 − d n 1 R_{t1} dMR_t \frac{ 1 - d }{ n} 1 Rt1dMRt…...

YOLOv8改进 | 模块缝合 | C2f 融合Self-Calibrated Convolutions丰富特征图【CVPR2020】
秋招面试专栏推荐 :深度学习算法工程师面试问题总结【百面算法工程师】——点击即可跳转 💡💡💡本专栏所有程序均经过测试,可成功执行💡💡💡 专栏目录 :《YOLOv8改进有效…...

跨境反向代购淘宝京东商品系统的商品价格详情等数据如何轻松自动化获取?
在跨境电商领域,反向代购系统逐渐成为连接国内外市场的重要桥梁。随着技术的不断发展和市场的日益成熟,如何高效、准确地自动化获取淘宝、京东等电商平台的商品价格、详情等数据,成为跨境反向代购系统开发者必须面对的重要课题。本文将详细介…...

初始爬虫5
响应码: 数据处理: re模块(正则表达式) re模块是Python中用于正则表达式操作的标准库。它提供了一些功能强大的方法来执行模式匹配和文本处理。以下是re模块的一些常见用法及其详细说明: 1. 基本用法 1.1 匹配模式 …...

深度盘点:2024年企业最喜欢用的WMS仓库管理系统有哪些?
本文将列举国内外知名的仓库管理系统,从每个系统的适用范围、核心功能、特点来为大家解读。为企业选型提供参考! WMS系统是Warehouse Management System(仓库管理系统)的简称,它是一个帮助企业和仓库管理者高效管理仓库…...
qt如何通过特定字符将字符串拆分写入输入?
在Qt中,处理字符串并基于特定字符拆分字符串然后将其写入(比如输入控件、文件等)是一项常见的任务。Qt提供了丰富的字符串处理功能,其中最常用的类是QString。以下是一个简单的示例,展示如何使用Qt和QString类基于特定…...

结构体实现位段
目录 1.什么是位段 2.位段的计算 3. 位段的内存分配 4.位段的跨平台问题 5.位段的应⽤ 6.位段使⽤的注意事项 1.什么是位段 段位的声明和结构体是类似的,但有两个不同之处: 1. 位段的成员必须是 int ,unsigned int,或 sign…...
刷题DAY35
判断回文数 题目:MM们都爱美,“回文”就是一种非常美的特殊的数或者文字短语,他们无论是顺读还是倒读,结果都一样。例如:12321, 55555,45554。如果GG们动不动来一段回文向MM们表达一下…...
浏览器访问 AWS ECS 上部署的 Docker 容器(监听 80 端口)
✅ 一、ECS 服务配置 Dockerfile 确保监听 80 端口 EXPOSE 80 CMD ["nginx", "-g", "daemon off;"]或 EXPOSE 80 CMD ["python3", "-m", "http.server", "80"]任务定义(Task Definition&…...

【Axure高保真原型】引导弹窗
今天和大家中分享引导弹窗的原型模板,载入页面后,会显示引导弹窗,适用于引导用户使用页面,点击完成后,会显示下一个引导弹窗,直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…...
在软件开发中正确使用MySQL日期时间类型的深度解析
在日常软件开发场景中,时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志,到供应链系统的物流节点时间戳,时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库,其日期时间类型的…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...

【入坑系列】TiDB 强制索引在不同库下不生效问题
文章目录 背景SQL 优化情况线上SQL运行情况分析怀疑1:执行计划绑定问题?尝试:SHOW WARNINGS 查看警告探索 TiDB 的 USE_INDEX 写法Hint 不生效问题排查解决参考背景 项目中使用 TiDB 数据库,并对 SQL 进行优化了,添加了强制索引。 UAT 环境已经生效,但 PROD 环境强制索…...
IGP(Interior Gateway Protocol,内部网关协议)
IGP(Interior Gateway Protocol,内部网关协议) 是一种用于在一个自治系统(AS)内部传递路由信息的路由协议,主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...

【OSG学习笔记】Day 16: 骨骼动画与蒙皮(osgAnimation)
骨骼动画基础 骨骼动画是 3D 计算机图形中常用的技术,它通过以下两个主要组件实现角色动画。 骨骼系统 (Skeleton):由层级结构的骨头组成,类似于人体骨骼蒙皮 (Mesh Skinning):将模型网格顶点绑定到骨骼上,使骨骼移动…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
音视频——I2S 协议详解
I2S 协议详解 I2S (Inter-IC Sound) 协议是一种串行总线协议,专门用于在数字音频设备之间传输数字音频数据。它由飞利浦(Philips)公司开发,以其简单、高效和广泛的兼容性而闻名。 1. 信号线 I2S 协议通常使用三根或四根信号线&a…...