Qt QTableWidget表格控件的用法(非常详细)

2023-05-16

已剪辑自: http://c.biancheng.net/view/vip_9657.html

QTableWidget 是 Qt 提供的一种表格控件(如图 1 所示),类似于我们经常使用的 Excel 表格,可以将数据以表格的方式展示给用户。QTableWidget 的结构布局如图 1 所示。

img
图 1 QTableWidget控件

整个 QTableWidget 表格可以分为 3 个区域:

  • 区域 ① 和 ② 都是表头,区域 ① 设置每一行的表头,区域 ② 设置每一列的表头。我们可以自定义两个区域内的表头,比如第一列是各个教程的名称,所以第一列的表头可以修改为“教程名称”;
  • 区域 ③ 为数据区,表格中所有的数据都位于此区域,该区域内可以存放单元格,也可以存放按钮、文本框等控件。

默认情况下,表格会显示表头,表头的内容为行号或列号。根据实际需要,我们可以将表头隐藏起来。

QTableWidget 继承自 QTableView 类,QTableView 类也可以用来显示表格控件。QTableWidget 可以看做是 QTableView 的“简易版”或者“升级版”,它们的区别在于:

  • QTableWidget 使用起来更简单,而 QTableView 的用法相对比较复杂。
  • QTableView 可以存储大量的数据(例如几十万甚至几百万),用户浏览表格中的数据时不会出现卡顿等现象;尽管 QTableWidget 也能用来存储大量的数据,但用户使用时可能出现卡顿等现象,且显示的数据越多,类似的现象越明显。

总之,QTableWidget 只适合显示少量的数据(几百或几千个),如果想要显示更多的数据,应该用 QTableView。此外,QTableView 还有一些更高级的用法,我们会在讲解 QTableView 时做重点介绍。

QTableWidget 框架在实际开发中经常使用,如果您是一名初学者,我建议先学习 QTableWidget 控件,它可以降低您学习 QT 表格控件的成本,可以更快地掌握表格的用法。

QTableWidget表格的创建

使用 QTableWidget 控件,必须先引入<QTableWidget>头文件。

QTableWidget 类提供了 2 个构造函数,分别是:

QTableWidget(QWidget *parent = Q_NULLPTR)
QTableWidget(int rows, int columns, QWidget *parent = Q_NULLPTR)

第一个构造函数可以在指定的 parent 父窗口中创建一个空的表格,表格中不显示任何单元格(如图 2a) 所示)。第二个构造函数可以在指定的 parent 父窗口中创建一个表格,表格中整齐地排列着 rows 行 columus 列的单元格,每个单元格都是空的(如图 2b) 所示)。

img
图 2 创建 QTableWidget 表格

实用 QTableWidget 表格之前,必须指定表格的行和列。我们可以直接调用第 2 个构造函数,这样既创建了表格又指定了行和列。当然,也可以调用第 1 个构造函数先创建表格,然后借助 QTableWidget 类提供的成员方法指定行和列,两种方式都可以。

与数组下标类似,QTableWidget 表格单元格的行标和列标都是从 0 开始。例如在图 2b) 中,选中的单元格的坐标是 (0, 0)。

QTableWidgetItem单元格

QTableWidget 表格中,每个单元格都是 QTableWidgetItem 类的实例对象。

定义 QTableWidgetItem 类的实例对象之前,程序中要引入<QTableWidgetItem>头文件。QTableWidgetItem 类提供了 4 个构造函数:

QTableWidgetItem(int type = Type)
QTableWidgetItem(const QString &text, int type = Type)
QTableWidgetItem(const QIcon &icon, const QString &text, int type = Type)
QTableWidgetItem(const QTableWidgetItem &other) //复制(拷贝)构造函数

text 参数用于指定单元格要显示的文本(字符串),icon 参数用于指定单元格要显示的图标,type 参数配有默认值,很少用到。

QTableWidgetItem 单元格通常用来存放 text 文本和 icon 图标,借助该类提供的 setBackground()、setTextAlignment() 等成员方法,我们可以轻松设置每个单元格的字体、颜色、背景等。

QTableWidgetItem 类还对<小于运算符进行了重载,根据各个单元格存储的文本内容(字符串),多个单元格之间可以直接比较大小。借助这一特性,我们可以很轻易地实现“单元格排序”功能。

默认情况下,用户可以选中 QTableWidget 表格中的某个单元格,还可以对目标单元格中的文本内容进行修改。通过设置 QTableWidget 表格,可以禁止用户编辑所有单元格。

QTableWidgetItem 类提供了很多实用的成员方法,其中比较常用的方法如下表所示:

表 1 QTableWidgetItem成员方法 成员方法 功 能

setText(const QString &text)设置单元格中的文本。
setIcon(const QIcon &icon)给单元格添加图标。
setBackground(const QBrush &brush)设置单元格的背景。
setFont(const QFont &font)设置单元格中文本的字体。
setForeground(const QBrush &brush)设置单元格中字体的颜色。
setTextAlignment(int alignment)设置单元格中文本的对齐方式。
setToolTip(const QString &toolTip)给单元格设置提示信息。

QTableWidget表格的使用

对于创建好的 QTableWidget 表格,我们可以借助该类提供的成员方法快速地操作它。

QTableWidget 类提供了很多实用的成员方法,它还从父类继承了很多方法,下表给大家罗列了实际场景中操作 QTableWidget 表格用得最多的几个方法,这些方法是初学者必须要掌握的:

QTableWidget类常用成员方法 成员方法 功 能

setRowCount(int rows)设置表格的行数。
setColumnCount(int columns)设置表格的列数。
setRowHeight(int row, int height)设置指定行的行高。
setColumnWidth(int column, int width)设置指定列的宽度。
setCellWidget(int row, int column, QWidget *widget)向表格中的指定位置添加 widget 控件。 通过调用 cellWidget(int row, int column) 方法,可以获取指定位置出的控件。
setHorizontalHeaderLabels(const QStringList &labels)设置表格的水平表头。
setVerticalHeaderLabels(const QStringList &labels)设置表格的竖直表头。
setItem(int row, int column, QTableWidgetItem *item)向表格指定位置添加单元格。 获取指定位置的单元格,可以借助 item(int row, int column) 或者 itemAt(int ax, int ay) 方法。
setEditTriggers(EditTriggers triggers)当 triggers 参数值为 QAbstractItemView::NoEditTriggers 时,表示禁止用户编辑单元格。
resize(int w, int h)设置表格的尺寸。
setFont(const QFont &)设置表格数据区中文本的字体和大小。

QTableWidget信号和槽

QTableWidget 类提供的信号函数,可以监听用户对表格中的哪个单元格进行了何种操作,常见的操作包括点击、双击、按下、编辑等。

下表展示了 QTableWidget 类提供的一些信号函数以及它们各自的功能:

表 3 QTableWidget信号函数 信号函数 功 能

cellClicked(int row,int column)当某个单元格被点击时,触发该信号,row 和 columu 就是被点击的单元格的位置。
cellDoubleClicked(int row,int column)当某个单元格被双击时,触发该信号,row 和 columu 就是被点击的单元格的位置。
cellEntered(int row,int column)当某个单元格被按下时,触发该信号,row 和 columu 就是被点击的单元格的位置。
cellChanged(int row, int column)当某个单元格中的数据发生改变时,触发该信号,row 和 columu 就是被改变的单元格的位置。
itemClicked(QTableWidgetItem *item)当某个单元格被点击时,触发该信号,item 就是被点击的单元格。
itemDoubleClicked(QTableWidgetItem *item)当某个单元格被双击时,触发该信号,item 就是被双击的单元格。
itemEntered(QTableWidgetItem *item)当某个单元格被按下时,触发该信号,item 就是被按下的单元格。
itemChanged(QTableWidgetItem *item)当某个单元格中的数据发生改变时,触发该信号,item 就是被改变的单元格。

QTableWiget 表格也可以接收信号并做出相应地响应,例如:

表 4 QTableWidget 槽函数 槽函数 功 能

clear()删除表格中所有单元格的内容,包括表头。
clearContents()不删除表头,仅删除表格中数据区内所有单元格的内容,
insertColumn(int column)在表格第 column 列的位置插入一个空列。
insertRow(int row)在表格第 row 行的位置插入一个空行。
removeColumn(int column)删除表格中的第 column 列,该列的所有单元格也会一并删除。
removeRow(int row)删除表格中的第 row 行,该行的所有单元格也会一并删除。
scrollToItem(const QTableWidgetItem *item, QAbstractItemView::ScrollHint hint = EnsureVisible)滑动到指定的单元格。

QTableWidget表格实例

接下来通过一个实例,带大家更深入地了解 QTableWidget 控件的用法。

#include <QApplication>
#include <QWidget>
#include <QLabel>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QStringList>
#include <QDebug>
#include <QPushButton>
using namespace std;
class QMyLabel:public QLabel{
    Q_OBJECT
public slots:
    void rsetText(QTableWidgetItem * item);
};
void QMyLabel::rsetText(QTableWidgetItem * item){
    this->setText(item->text());
}
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    //创建一个窗口,作为输入框和列表框的父窗口
    QWidget widget;
    //设置窗口的标题
    widget.setWindowTitle("QTableWidget控件");
    //自定义窗口的大小
    widget.resize(900,500);
    //在 widget 窗口中添加一个 4 行 3 列的表格
    QTableWidget TableWidget(4,3,&widget);
    //自定义表格的尺寸和字体大小
    TableWidget.resize(900,350);
    TableWidget.setFont(QFont("宋体",20));
    //设置表格中每一行的表头
    TableWidget.setHorizontalHeaderLabels(QStringList() << "教程" << "网址" << "状态");
    //设置表格数据区内的所有单元格都不允许编辑
    TableWidget.setEditTriggers(QAbstractItemView::NoEditTriggers);
    //设置表格中每一行的内容
    TableWidget.setItem(0,0,new QTableWidgetItem("C语言教程"));
    TableWidget.setItem(0,1,new QTableWidgetItem("http://c.biancheng.net/c/"));
    TableWidget.setItem(0,2,new QTableWidgetItem("已更新完毕"));
    TableWidget.setItem(1,0,new QTableWidgetItem("Qt教程"));
    TableWidget.setItem(1,1,new QTableWidgetItem("http://c.biancheng.net/qt/"));
    TableWidget.setItem(1,2,new QTableWidgetItem("正在更新"));
    TableWidget.setItem(2,0,new QTableWidgetItem("C++教程"));
    TableWidget.setItem(2,1,new QTableWidgetItem("http://c.biancheng.net/cplus/"));
    TableWidget.setItem(2,2,new QTableWidgetItem("已更新完毕"));
    //向 widget 窗口中添加一个文本框
    QMyLabel lab;
    lab.setText("选中单元格");
    lab.setParent(&widget);
    //自定义文本框的尺寸和位置
    lab.resize(900,150);
    lab.move(0,350);
    lab.setAlignment(Qt::AlignCenter);
    lab.setFont(QFont("宋体",16));
    widget.show();
    //为表格和文本框之间建立关联,当用户点击表格中某个单元格时,文本框显示单元格内的文本内容。
    QObject::connect(&TableWidget,&QTableWidget::itemClicked,&lab,&QMyLabel::rsetText);
    return a.exec();
}
//QMyLabel类的定义应该放到 .h 文件中,本例中将其写到 main.cpp 中,程序最后需要添加 #include "当前源文件名.moc" 语句,否则无法通过编译。
#include "main.moc"

程序的执行结果为:

img

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Qt QTableWidget表格控件的用法(非常详细) 的相关文章

  • QTableWidget中添加QComboBox/QPushButton控件并响应控件点击

    QTableWidget是QT程序中常用的显示数据表格的空间 xff0c 里面不仅仅可以添加文字 xff0c 也可以添加控件 xff0c 图片等等 xff0c 此处以添加QCombobox和QPushButton举例 xff0c 点击选择控
  • QTableWidget获取选中行内容

    首先介绍一下csdn屏蔽广告 这个至关重要 xff0c 请参考 https blog csdn net Demo Liu article details 81538222 QList lt QTableWidgetItem gt items
  • C++,友元,语法+示例,非常详细!!!!

    友元概念 友元的目的就是让一个函数或者类 访问另外一个类中的私有成员 友元的关键字为 friend 友元的几种实现 全局函数做 友元类做 友元成员函数做 友元重载函数做 友元 全局函数做 友元 include lt iostream gt
  • Qt在QTableWidget、View等表格中添加右击菜单

    先来看效果图 鼠标点在哪里菜单显示在哪里 实现代码 在构造函数中设置右击菜单 并关联右击的槽函数 ui tableWidget gt setContextMenuPolicy Qt CustomContextMenu 设置右击菜单 conn
  • Qt

    Qt QListView QListWidget QTableView QTableWidget的使用示例及区别 目录 Qt QListView QListWidget QTableView QTableWidget的使用示例及区别 1 简
  • Qt QTableWidget使用记录

    去除选中虚线框 ui gt tableWidget gt setFocusPolicy Qt NoFocus Qt QTableWidget详解https blog csdn net wzz953200463 article details
  • Python - PyQt - QTable Widget - 添加行

    我是 PyQt 的新手 无论如何仍然有点困惑 我有一个像这样的文本文件结构 姓名 姓氏 电话 电子邮件 空格实际上是制表符 t 现在当我用我的方法读取这个文件时 我希望填充 QTableWidget 我的 QTable Widget 有 4
  • QTableWidget列大小调整事件

    我想知道 QTableWidget 的列是否正在通过鼠标调整大小 每当调整任何列的大小时 如何发出信号 列大小调整是通过水平方向执行的QHeaderView 通过调用访问它QTableWidget horizontalHeader cons
  • 从 QTableWidget 读取选定的项目

    如何从 QTableWidget 读取选定的项目 Thanks int QTableWidget currentRow const返回当前项目的行 int QTableWidget currentColumn const返回当前项目的列
  • 如何防止 QTableview 中过于激进的文本删除?

    I have an issue with text elide in Qt being too aggressive in a table see picture 带有完整数字0 8888的单元格 自从显示QTableWidget以来我已经
  • QTablewidget 删除而不创建新行

    我有一个 QTableWidget 并且 1 列只有复选框 因此对于这些项目我有这些标志 create prototype for checkbox item checkItem new QTableWidgetItem Qt ItemFl
  • 在 QTableWidget 中选择行和列,同时保持突出显示

    我设置了一个 QTableWidget 您无法选择单元格 但可以通过标题选择行 列 我遇到的问题是 当我选择一行时 它会取消选择已选择的任何列 列 行也是如此 我希望能够选择具有 ExtendedSelection 行为的行和具有 Sing
  • 排序后 QTableWidget 的填充不完整

    我有一个 QTableWidget 它将填充一些随机值 该表已启用排序 tableWidget setSortingEnabled True 排序工作正常 我知道 在这个最小的例子中 它将是按字母数字排序的数字 但是 当我按一列对表格进行排
  • PyQt 对齐复选框并将其放在每一行中

    我正在尝试做this http falsinsoft blogspot ro 2013 11 qtablewidget center checkbox inside cell html与复选框 遗憾的是 它是为 C 编写的 并且对 Pyth
  • Qt学习_17_一些关于QTableWidget的记录

    1 QTableWidget clear 程序异常退出 近日 项目中使用到QTableWidget 遇到一个问题 项目需要清空这个表格 但是无论调用clear clearContents 程序都报 程序异常退出 而且项目程序还比较多 最开始
  • PySide:如何放大QTableWidget中的图像?

    我在使用 PySide QTableWidget 时遇到问题 我需要在所有行的第一列中添加图像预览 我正在尝试使用 QIcon 添加此内容 library table insertRow index library table setIte
  • 如何通过拖动 Widget 的角来调整 Widget 上的 QTableWidget 大小

    我想调整大小QTableWidget通过拖动右下角 如下面的屏幕截图所示 这个怎么做 这是我的代码 code from PySide QtGui import QApplication QWidget QTableWidget week m
  • 如何在 QTableWidget 中将列中的所有项目对齐到中心

    我正在使用 PyQt5 并使用 PyCharm 如何将一列下的所有单元格居中对齐 下面的代码似乎有效 但仅适用于一个单元格 即标题 我应该更改或添加什么 item3 QtWidgets QTableWidgetItem Item Name
  • 如何在 QTableWidget 的行和列中自动换行文本?

    I tried QTableWidget j new QTableWidget 10000 5 centralWidget j gt setColumnWidth 0 500 j gt setColumnWidth 1 30 j gt se
  • Qt表格小部件,删除行的按钮

    我有一个 QTableWidget 对于所有行 我将一列的 setCellWidget 设置为按钮 我想将此按钮连接到删除该行的函数 我尝试了这段代码 它不起作用 因为如果我只是单击按钮 我不会将当前行设置为按钮的行 ui gt table

随机推荐

  • QT使用QAxObject读取Excel教程-全网最全

    文章目录 一 背景二 介绍基本操作方法获取对象调用动态方法设置和获取属性更多相关 三 使用要求添加模块与excel com连接的方法Excel基本操作 四 具体使用说明五 项目实战实战项目1实战项目2实战项目3实战项目4实战项目5 封装好的
  • 超越内卷-认知差、信息差、时间差

    已剪辑自 https mp weixin qq com s 9pzMQJJnp9ZbkTCVe ao7w 内卷的话题曾经聊过 xff0c 当大家的努力都上不了层次 xff0c 只是原水平重复竞争 xff0c 那么内卷就开始了 最近对这个问题
  • 数十种嵌入式 C 语言代码优化的经验和方法

    文章目录 简介声明哪里需要使用这些方法 xff1f 整形数除法和取余数合并除法和取余数通过2的幂次进行除法和取余数取模的一种替代方法使用数组下标全局变量使用别名变量的生命周期分割变量类型局部变量指针指针链条件执行布尔表达式和范围检查布尔表达
  • 汽车电子国际标准现状与趋势

    已剪辑自 https mp weixin qq com s vLgnrFPtDPglwde1TZUHSQ 在汽车电子系统发展的早期 xff0c 汽车电子基础软件是没有统一标准的 xff0c 各个 OEM Tier1 Tier2 等厂商针对不
  • Linux多线程服务器编程(陈硕)学习总结

    这本书确实是学习多核时代采用现代C 43 43 编写多线程程序的好书 xff0c 下面是学习总结 xff1a 第一章 线程安全的对象生命期管理 对象的创建很简单 xff0c 但是不要在构造期间泄漏this指针 xff0c 比如不要在构造函数
  • 详解 Modbus 通信协议(清晰易懂)

    文章目录 已剪辑自 https mp weixin qq com s dvo1l1GgJ2DtIHnPK5E1tA 本文总结关于 Modbus 相关的知识 xff0c 浅显易懂 xff0c 旨在对 Modbus 有一个很直观的了解 如有错误
  • RTOS应用中的几种调度策略

    从前后台架构的软件开发过渡到使用实时操作系统 RTOS 可能是一项困难的工作 但使用RTOS有许多优势 xff0c 例如简化应用集成 xff0c 支持任务抢占调度 xff0c 当开发人员使用复杂的32位微控制器 xff0c 且可以获取足够的
  • 几款非常棒的使用文本来进行图形化注释的工具

    https mp weixin qq com s NX8feH UPE7oegM7U9W4GA 说明 xff1a 1 程序代码里面非常好的注释方式 2 相关网站 xff1a xff08 1 xff09 https metacpan org
  • 解决Excel打开UTF-8编码CSV文件乱码的问题

    最近在用QT读写CSV文件 xff0c 发现将数据写入到CSV文件中 xff0c 使用记事本打开文件是正常的 xff0c 使用Excel打开 xff0c 中文是乱码的 xff0c 下面把原因和解决方法记录一下 问题产生的原因 为什么exce
  • Windows下查看端口占用情况

    编程的时候经常发现我们需要使用的端口被别的程序占用 xff0c 这个时候需要清楚查看是哪个程序占用了端口 xff0c 用且清除了这个进程 xff01 1 开始 gt 运行 gt cmd xff0c 或者是window 43 R组合键 xff
  • 【C进阶】同事用void把我给秀翻了!

    2 简单认识一下void 今天跟大家介绍的知识是C语言中的void关键字的用法 xff0c void在大部分小伙伴的程序中都只是用于函数无参数传入 xff0c 或者无类型返回 然而我们平时所定义的变量都会有具体的类型 xff0c int x
  • 如何降低代码圈复杂度

    已剪辑自 https mp weixin qq com s biz 61 MzI2MTE4Nzk5MA 3D 3D amp mid 61 2247483685 amp idx 61 1 amp sn 61 26072d6a41ed9abef
  • 嵌入式开发:周期调度和代码执行时间理解

    已剪辑自 https mp weixin qq com s gaT7D1IgkBxxEOj DNaLPw 汽车嵌入开发中 xff0c 我们常常听到这样的名词 xff1a 1ms Task 5ms Task 10ms Task 试问 xff1
  • C语言中,实现函数宏的三种方式

    已剪辑自 https blog csdn net qq 35692077 article details 102994959 1 函数宏介绍 函数宏 xff0c 即包含多条语句的宏定义 xff0c 其通常为某一被频繁调用的功能的语句封装 x
  • 代码是如何控制硬件的?

    已剪辑自 https mp weixin qq com s UDbxTfAMLAWE8LjUiqGUBQ 先说代码 xff1a 我们是用电脑的键盘来输入的指令 xff0c 每一个指令都对应一个ASCII码 xff0c 而这里的ASCII码就
  • 使用Realsense D435相机在ROS Kinetic中跑通ORB-SLAM2

    文章中不足 xff0c 错误的地方欢迎大家批评指正 xff0c 如果哪步遇到了问题 xff0c 我尽力为你解答 皱眉 这个文章主要是想记录当时配环境的步骤 xff0c 以防以后再配忘了某步 目录 使用配置主要步骤安装基于ROS使用RealS
  • libc6-dev: 依赖: libc6 (= 2.27-3ubuntu1.3) 但是 2.31-0ubuntu9.1 正要被安装...

    libc6 dev 依赖 libc6 61 2 27 3ubuntu1 3 但是 2 31 0ubuntu9 1 正要被安装 参考链接 xff1a https blog csdn net WU2629409421perfect articl
  • Debug模式和Release模式有什么区别?

    已剪辑自 https mp weixin qq com s 4iiB48m30p4 egKBD3QY3A 张爱玲曾说过 xff1a 开发过程就是个玄学 有时候 xff0c 程序在Debug模式下运行的好好的 xff0c 一Release就c
  • 同样是软件开发,为什么没有嵌入式软件架构师

    已剪辑自 https mp weixin qq com s mKQ d8mfau JB04v coWg 大家好 xff0c 今天分享一篇关于嵌入式软件架构师的文章 xff0c 文中的 我 为作者本人 希望对从事嵌入软件开发的你有所启发 我从
  • Qt QTableWidget表格控件的用法(非常详细)

    已剪辑自 http c biancheng net view vip 9657 html QTableWidget 是 Qt 提供的一种表格控件 xff08 如图 1 所示 xff09 xff0c 类似于我们经常使用的 Excel 表格 x