QT原生控件-QTableWidget的使用及样式

前言


本文主要介绍的是使用代码生成的情况下对控件的介绍,包括拥有的功能及能修改的样式,也会说明在qtdesiner拖拽控件生成和使用代码生成控件的区别(如果有的话,遇到了的会说),此版本不属于最终版本,以后遇到什么新奇的点会继续更新!本文基于QT官方的文档进行的编写,QT版本为qt 5.14.0,编写环境为Windows11。不得不说官方文档真是个好东西,有时候有些不会的上去一看就能有灵感解决了,可惜没有中文版本的。

一、QTableWidget初步介绍

QTableWidget 的话是Qt 中用于 ​二维表格数据展示和编辑​​的控件,简单来说就是表格控件,然后这个控件基于Model/View架构来封装的,这个架构的话我们以后再说,下面是QTableWidget和QTableView的粗略对比

特性QTableWidgetQTableView
数据存储自带QTableWidgetItem存储数据依赖外部Model(如QStandardItemModel)
灵活性适合简单表格场景适合复杂数据绑定或自定义Model
内存占用较高(直接管理所有单元格)较低(按需加载)
开发便捷性快速实现增删改查需动手实现Model/Delegate逻辑

QTableWidget提供了非常多的的 API供用户来操作单元格内容、表头、行列属性等等,QTableWidget里面的单元格是由QTableWidgetItem组成的,所以可以通过API去获取并操作。

此外,其实QTableWidget的话可以很笼统的说成是一个QTableView和QTableWidgetItem的一个操作框架,QTableWidget的接口也大多数是操控项的数量和选择之类的方法,像改变项的宽度高度的话操作的其实是QTableWidget继承的QTableView父类的方法;所以更多QTableWidget的功能的话我们在QTableView的介绍…中写,这里就不写太多了,那我们就一个个来看官方文档中给出的关于QTableWidget的一些常用方法吧。

二、基本功能

1.创建主界面

在这里插入图片描述

QTableWidget* tabwidget = new QTableWidget(2,3);//可以在实例化时就指定行数列数
table->setHorizontalHeaderLabels({"新建列", "新建列", "新建列"}); // 设置水平表头
table->setVerticalHeaderLabels({"新建行", "新建行"}); // 设置垂直表头

如下图,有时候我们会弄反行列的参数位置,只要记住“行列”“行列”就行了,如果在项目开发过程中没有特殊要求的话,建议还是使用Designer去拖拽生成控件,不然代码要写很多!
在这里插入图片描述

2. 行/列管理​​

1)setRowCount
设置行数

void setRowCount(int rows)

2)setColumnCount
设置列数

void setCoulumnCount(int columns)

3)rowCount
获取行数总和

int rowCount() const

4)columnCount
获取列数总和

int columnCount() const

5)insertRow
插入行,参数为插入位置

void insertRow(int row)​​

6)insertColumn
插入列,参数为插入位置

void insertColumn(int column)

7)removeRow
移除行,参数为移除位置

void removeRow(int row)​​

8)removeColumn
移除列,参数为移除位置

void removeColumn(int column)​​

9)column
根据单元格对象QTableWidgetItem去获取到他所在的列索引,如果是无效项的话返回-1

​​int column(const QTableWidgetItem *item) const​​ 

10)currentColumn
返回当前选中单元格的列索引

​​int currentColumn() const​​​ 

11)currentRow
返回当前选中单元格的行索引

​​int currentRow() const

12)row
根据单元格项返回其所在的行索引。

​​int row(const QTableWidgetItem *item) const

3.单元格操作

1)currentItem
返回当前选中的单元格对象的指针

QTableWidgetItem *currentItem() const​​ 

2)editItem
触发单元格对象的编辑模式

​​void editItem(QTableWidgetItem *item)

在这里插入图片描述

3)findItems
查找包含指定文本的单元格项;

QList<QTableWidgetItem *> findItems(const QString &text, Qt::MatchFlags flags) const //@param text:匹配文本 flags:匹配模式(如:Qt::MatchExactly 精确匹配)

4)horizontalHeaderItem
返回水平表头指定列的项指针

QTableWidgetItem *horizontalHeaderItem(int column) const

5)item
返回指定行和列的单元格项,这个的话用的就比较多了,经常用于获取单元格对象

QTableWidgetItem *item(int row, int column) const

6)itemAt
根据坐标点返回对应的单元格项

​​QTableWidgetItem *itemAt(const QPoint &point) const​​ 
QTableWidgetItem *itemAt(int x, int y) const

7)removeCellWidget
移除单元格内嵌入的控件

void removeCellWidget(int row, int column)

8)selectedItems
返回所有选中的单元格项列表。

QList<QTableWidgetItem *> selectedItems() const​​

9)removeCellWidget
返回选中的区域范围列表。

QList<QTableWidgetSelectionRange> selectedRanges() const​​

10)removeCellWidget
在单元格内嵌入自定义控件(如QPushButton、QLabel)

void setCellWidget(int row, int column, QWidget *widget)

11)removeCellWidget
移除单元格内嵌入的控件

void removeCellWidget(int row, int column)

12)setCurrentCell
设置当前选中单元格,注意这不会产生任何选择标志!

void setCurrentCell(int row, int column)
​​void setCurrentCell(int row, int column,QItemSelectionModel::SelectionFlags command)​​ ​​//可指定选择模式

13)setHorizontalHeaderItem / setVerticalHeaderItem
设置水平/垂直表头指定列的项

​​void setHorizontalHeaderItem(int column, QTableWidgetItem *item)​​ 
​​void setVerticalHeaderItem(int row, QTableWidgetItem *item)​​ 
//示例:
table->setHorizontalHeaderItem(0, new QTableWidgetItem("ID"));

14)setHorizontalHeaderLabels / setVerticalHeaderLabels
批量设置水平/垂直表头文本

void setHorizontalHeaderLabels(const QStringList &labels)
void setVerticalHeaderLabels(const QStringList &labels)
//示例:
table->setHorizontalHeaderLabels({"Name", "Age", "Gender"});

15)setItem
设置单元格的项

​​void setItem(int row, int column, QTableWidgetItem *item)
//示例:
table->setItem(0, 0, new QTableWidgetItem("Alice"));

16)sortItems
按指定列排序表格数据

void sortItems(int column, Qt::SortOrder order = Qt::AscendingOrder)
//示例:
table->sortItems(1, Qt::DescendingOrder); // 按第1列降序排序​

17)移除项

QTableWidgetItem *takeItem(int row, int column)				//移除指定项并返回项
​​QTableWidgetItem *takeHorizontalHeaderItem(int column)		//移除水平表头的项并返回项
QTableWidgetItem *takeVerticalHeaderItem(int row)			//移除垂直表头的项​​并返回项

4.槽函数

1)clear
清空表格(包括所有行、列和表头)

void clear()

2)clearContents
仅清空单元格内容(保留行列结构)。

​​void clearContents()​​ 

3)scrollToItem
滚动表格以确保指定项可见。

void scrollToItem(const QTableWidgetItem *item, QAbstractItemView::ScrollHint hint = EnsureVisible)

三、信号

1)cellActivated
单元格被激活,通常由双击或回车键触发。

void cellActivated(int row, int column)

2)cellChanged
单元格内容被修改后触发。

​​void cellChanged(int row, int column)​​ 

3)cellClicked
单元格被单击。

​​void cellClicked(int row, int column)​​ 

4)cellDoubleClicked
单元格被双击。

​​void cellDoubleClicked(int row, int column)​​ 

5)cellEntered
鼠标进入单元格区域。

​​void cellEntered(int row, int column)​​ 

6)cellPressed
鼠标按下单元格。

​​void cellPressed(int row, int column)​​ 

7)currentCellChanged
当前选中单元格变化时触发。

​​void currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn)​​ 

8)currentItemChanged
当前选中项变化时触发。

​​void currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous)​​ 

9)itemActivated
项被激活,与 cellActivated 对应。

​​void itemActivated(QTableWidgetItem *item)​​ 

10)itemChanged
项内容被修改后触发。

​​void itemChanged(QTableWidgetItem *item)​​ 

11)itemClicked
项被单击。

​​void itemClicked(QTableWidgetItem *item)​​ 

12)itemDoubleClicked
项被双击。

​​void itemDoubleClicked(QTableWidgetItem *item)​​ 

13)itemEntered
鼠标进入项区域。

​​void itemEntered(QTableWidgetItem *item)​​ 

14)itemPressed
鼠标按下项。

​​void itemPressed(QTableWidgetItem *item)​​ 

15)itemSelectionChanged
选中项集合变化时触发。

​​void itemSelectionChanged()​​ 

四、QTabWidget样式

选择器

1)QTableWidget QHeaderView::section
控制表头的样式;
注意!使用这个样式本人在开发过程中遇到过一个小问题,就是直接使用QTableWidget对象直接设置这个样式,只有垂直表头的样式生效,在水平表头并不会生效,如下图:
在这里插入图片描述

解决方法的话就是:使用QTableWidget对象获取到头对象,然后设置头对象的样式:
tableWidget->horizontalHeader()->setStyleSheet()
效果如下:
在这里插入图片描述

QTableWidget QHeaderView::section 
{
    background: #333;      /* 表头背景色 */
    color: white;          /* 表头文字颜色 */
    padding: 6px;
}

2)QTableWidget QScrollBar::vertical
控制垂直滚动条的样式,可将vertical改为horizontal,就可以控制水平方向滚动条的样式;
注意!这里也有一个问题,就是使用Designer创建的QTableWidget,直接在Designer设置QTableWidget的滚动条样式是生效的,但是如果是在代码中设置的话不生效,找了很久没找到是什么问题,在ui代码文件中也是很正常,解决办法的话要不就在Designer中设置滚动条样式,要不就在代码中设置QTableWidget的父容器中设置滚动条样式

QTableWidget QScrollBar:vertical 
{
    width: 12px;          /* 垂直滚动条宽度 */
}

伪状态

QTableWidget的伪装态的话没有什么特别的,一般用在QTableWidgetItem上比较多,像:hover悬停,:pressed鼠标按下,:disabled控件禁用,:focus控件获得焦点,:selected单元格选中等

/********示例********/
/* 表格整体样式 */
QTableWidget {
    background: white;
    gridline-color: #ddd;
    font-size: 12px;
}
/* 表头样式 */
QHeaderView::section {
    background: #2c3e50;
    color: white;
    border: none;
    padding: 8px;
}
/* 单元格悬停效果 */
QTableWidget::item:hover {
    background: #e8f4ff;
}
/* 选中行/单元格 */
QTableWidget::item:selected {
    background: #3498db;
    color: white;
}

在这里插入图片描述

本次分享就到这里了,如果有什么错误的话请指正,或者有什么疑问的,也可以在评论区一起探讨!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值