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

目录

[1 -> 概述](#1 -> 概述)

[2 -> QTableWidget 核心方法](#2 -> QTableWidget 核心方法)

[3 -> QTableWidgetItem 核心信号](#3 -> QTableWidgetItem 核心信号)

[4 -> QTableWidgetItem 核心方法](#4 -> QTableWidgetItem 核心方法)

[5 -> 丰富多样的内置控件库](#5 -> 丰富多样的内置控件库)

[6 -> 核心优势与设计哲学](#6 -> 核心优势与设计哲学)

[7 -> 代码示例](#7 -> 代码示例)

[8 -> 总结](#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 便派上了用场。它通过下拉列表的形式,既节省了空间,又确保了输入值的准确性和一致性,非常适合用于"状态"、"类别"等字段。

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

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

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

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

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

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

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

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

7 -> 代码示例

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

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

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

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 函数

cpp 复制代码
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 的单元格控件特性,无疑是打造现代化、高效率桌面应用的一条捷径。


感谢各位大佬支持!!!

互三啦!!!

相关推荐
bin91533 小时前
当AI开始‘映射‘用户数据:初级Python开发者的创意‘高阶函数‘如何避免被‘化简‘?—— 老码农的函数式幽默
开发语言·人工智能·python·工具·ai工具
Nebula_g4 小时前
Java哈希表入门详解(Hash)
java·开发语言·学习·算法·哈希算法·初学者
努力努力再努力wz4 小时前
【C++进阶系列】:万字详解unordered_set和unordered_map,带你手搓一个哈希表!(附模拟实现unordered_set和unordered_map的源码)
java·linux·开发语言·数据结构·数据库·c++·散列表
励志不掉头发的内向程序员4 小时前
【STL库】哈希表的原理 | 哈希表模拟实现
开发语言·c++·学习·散列表
万粉变现经纪人4 小时前
如何解决 pip install -r requirements.txt 私有仓库认证失败 401 Unauthorized 问题
开发语言·python·scrapy·flask·beautifulsoup·pandas·pip
量子炒饭大师4 小时前
收集飞花令碎片——C语言字符函数与字符串函数
c语言·开发语言
懂得节能嘛.4 小时前
【设计模式】Java规则树重构复杂业务逻辑
java·开发语言·设计模式
syt_biancheng4 小时前
Qt--命名,快捷键及坐标系
开发语言·qt