【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的全部介绍,如有不足与缺陷之处,欢迎评论区留言!!!   

 

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

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

相关文章

[SUCTF 2018]annonymous1

知识点&#xff1a; 匿名函数创建其实有自己的名字&#xff08;%00lambda_%d&#xff09; 进入页面开始代码审计. <?php // 使用 create_function 创建一个匿名函数&#xff0c;该函数调用 die() 函数并执行 cat flag.php 命令&#xff08;在服务器上执行&#xff0c;如果…

如何在 DigitalOcean Droplet 云服务器上部署 Next.js 应用

Next.js 是一个流行的 React 框架&#xff0c;可轻松构建服务器渲染的 React 应用程序。在本教程中&#xff0c;我们将介绍如何使用 Nginx 作为反向代理&#xff0c;在 DigitalOcean 的 droplet 云主机上部署 Next.js 应用程序。以下是逐步指南&#xff0c;假设你已经准备好部署…

基于SpringBoot+Vue+MySQL的牙科医就诊管理系统

系统展示 用户前台界面 管理员后台界面 系统背景 当前社会各行业领域竞争压力非常大&#xff0c;随着当前时代的信息化&#xff0c;科学化发展&#xff0c;让社会各行业领域都争相使用新的信息技术&#xff0c;对行业内的各种相关数据进行科学化&#xff0c;规范化管理。这样的…

HTML/CSS/JS学习笔记 Day2(HTML--网页标签 上)

跟着该视频学习&#xff0c;记录笔记&#xff1a;【黑马程序员pink老师前端入门教程&#xff0c;零基础必看的h5(html5)css3移动端前端视频教程】https://www.bilibili.com/video/BV14J4114768?p12&vd_source04ee94ad3f2168d7d5252c857a2bf358 Day2 内容梳理&#xff1a;…

儿童孤独症康复学校:打破孤岛,关爱与成长

在世界的某个角落&#xff0c;有一群孩子&#xff0c;他们如同夜空中最亮的星&#xff0c;却往往因孤独症的屏障&#xff0c;而难以与周围的世界建立连接。这些孩子&#xff0c;如同被无形的岛屿环绕&#xff0c;渴望着被理解、被接纳。而正是在这样的背景下&#xff0c;星贝育…

[C++11#48][智能指针] RAII原则 | 智能指针的类型 | 模拟实现 | shared_ptr | 解决循环引用

目录 一.引入 1. 为什么需要智能指针&#xff1f; 2. 什么是内存泄漏&#xff1f; 内存泄漏分类 3.回忆 this 二. 原理 1. RAII 资源获取即初始化 2.像指针一样 三. 使用 1. 问题&#xff1a; string 的浅拷贝 2.解决 auto_ptr 自定义 auto_ptr unique_ptr - 独占…

原生 iOS 引入 Flutter 报错 kernel_blob.bin 找不到

情况 在一次原生 iOS 项目中引入 Flutter 的过程中&#xff0c;在模拟器中运行出现报错&#xff1a; 未能打开文件“kernel_blob.bin”&#xff0c;因为它不存在。 如下图&#xff1a; 模拟器中一片黑 原因&解决方案 这个是因为 Flutter 的打包 iOS framework 命令中…

ES之三:springboot集成ES

一.选择版本很重要&#xff0c;不然会找不到好多方法 明明有Timeout方法&#xff0c;不报红&#xff0c;运行时&#xff0c;报错&#xff0c;找不到该类 ClassNotFoundException 为了避免使用的Elasticsearch版本和SpringBoot采用的版本不一致导致的问题&#xff0c;尽量使用…

高校大模型实验室大模型应用平台

大模型应用平台是一款专为高校大模型应用场景教学和科研打造的知识库问答系统。该平台易于使用&#xff0c;知识库支持常见的txt、doc、pdf、md等数据文件上传&#xff0c;同时提供了简洁易懂的操作配置界面&#xff0c;使用户可以轻松地搭建和训练AI应用&#xff0c;并快速进行…

arm64高速缓存基础知识

高速缓存的替换策略 随机法&#xff1a;随机地确定替换的高速缓存行&#xff0c;由一个随机数产生器产生随机数来确认替换行 FIFO法&#xff1a;选择最先调入的高速缓存行进行替换 LRU法&#xff1a;最少使用的行优先替换。 高速缓存的共享属性 内部共享的高速缓存通常指的…

Flutter基本组件Text使用

Text是一个文本显示控件&#xff0c;用于在应用程序界面中显示单行或多行文本内容。 Text简单Demo import package:flutter/material.dart;class MyTextDemo extends StatelessWidget {const MyTextDemo({super.key});overrideWidget build(BuildContext context) {return Sca…

飞速了解Conda的作用和安装使用教程

当我们想要在github上克隆不同的项目下来运行时&#xff0c;会发现项目的语言环境或包的版本不同&#xff0c;出现版本冲突问题会导致程序无法运行、兼容性问题频出。我们常常需要管理多个项目&#xff0c;每个项目可能依赖于不同的包版本或编程语言环境。如果不加以管理&#…

agentuniverse快速开始和踩坑

https://github.com/alipay/agentUniverse/tree/mastergithub地址:https://github.com/alipay/agentUniverse/tree/master 老大看了演示demo也想跟着做个agent工具,但踩坑太多,含泪写下博客 前置环节 git clone https://github.com/alipay/agentUniverse.git conda create -n…

AndroidStudio清除重置Http Proxy代理的方式

问题背景 在国内做代码开发的都知道&#xff0c;在国际互联网我们存在看不见的墙&#xff0c;导致无法访问一些代码库和资源&#xff0c;所以在使用开发工具拉取第三方库的时候总会遇到无法连接或者连接超时的情况&#xff0c;所以就会使用一些安全的网络代理工具&#xff0c;辅…

【JavaSE】Java基本数据类型缓存池

new Integer(18) 、 Integer.valueOf(18) 、Integer.valueOf(300) 的区别 new Integer(18) &#xff1a;每次都会创建一个新对象Integer.valueOf(x)&#xff1a; x in [-128, 127]&#xff1a;使用缓存池中的对象x not in [-128, 127]&#xff1a;创建新对象 Integer缓存池大…

【Qt】事件分发器

事件分发器 概述 在 Qt 中&#xff0c;事件分发器(Event Dispatcher) 是⼀个核⼼概念&#xff0c;⽤于处理 GUI 应⽤程序中的事件。事件分发器负责将事件从⼀个对象传递到另⼀个对象&#xff0c;直到事件被处理或被取消。每个继承⾃ QObject类 或 QObject类 本⾝都可以在本类中…

《纳瓦尔宝典》的核心思想在于阐述如何通过智慧和策略实现财富自由和生活幸福

《纳瓦尔宝典》概况 图书概况 《纳瓦尔宝典》是2022年5月10日由中信出版社出版的一本书籍&#xff0c;作者是美国作家埃里克乔根森。该书通过收集和整理硅谷知名天使投资人纳瓦尔拉维坎特在推特、博客和播客等平台上的智慧箴言&#xff0c;形成了一本关于财富积累和幸福人生的…

如何在红米手机中恢复已删除的照片?(6 种方式可供选择)

凭借出色的相机和实惠的价格&#xff0c;小米红米系列已成为全球知名品牌。但是&#xff0c;最近有些人抱怨他们在 红米设备上丢失了许多珍贵的图片或视频&#xff0c;并希望弄清楚如何从小米手机恢复已删除的照片。好吧&#xff0c;在小米设备上恢复已删除的视频/照片并不难。…

AI预测福彩3D采取888=3策略+和值012路或胆码测试9月8日新模型预测第81弹

经过80期的测试&#xff0c;当然有很多彩友也一直在观察我每天发的预测结果&#xff0c;得到了一个非常有价值的信息&#xff0c;那就是9码定位的命中率非常高&#xff0c;70多期一共只错了8次&#xff0c;这给喜欢打私房菜的朋友提供了极高价值的预测结果~当然了&#xff0c;大…

牛客周赛 Round 59(下)

逆序数 题目描述 登录—专业IT笔试面试备考平台_牛客网 运行代码 #include<bits/stdc.h> using namespace std; typedef long long ll; int main() {ll n,k;cin>>n>>k;ll sum(n*(n-1))/2;cout<<sum-k<<endl;return 0; } 代码思路 组合数的计…