前言
本文主要介绍的是使用代码生成的情况下对控件的介绍,包括拥有的功能及能修改的样式,也会说明在qtdesiner拖拽控件生成和使用代码生成控件的区别(如果有的话,遇到了的会说),此版本不属于最终版本,以后遇到什么新奇的点会继续更新!本文基于QT官方的文档进行的编写,QT版本为qt 5.14.0,编写环境为Windows11。不得不说官方文档真是个好东西,有时候有些不会的上去一看就能有灵感解决了,可惜没有中文版本的。
一、QTableWidget初步介绍
QTableWidget 的话是Qt 中用于 二维表格数据展示和编辑的控件,简单来说就是表格控件,然后这个控件基于Model/View架构来封装的,这个架构的话我们以后再说,下面是QTableWidget和QTableView的粗略对比
特性 | QTableWidget | QTableView |
---|---|---|
数据存储 | 自带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;
}
本次分享就到这里了,如果有什么错误的话请指正,或者有什么疑问的,也可以在评论区一起探讨!