TableWidget

1.初始化表格

开发时一般在QT Designer 中拖拽一个QTableWidget到页面上,设置好布局后在UI页面对应的cpp文件中对表格进行操作即可,不过QTableWidget此时是空白的

image-20240321095037980

1.1设置表头

1
2
3
4
5
6
7
8
9
10
11
12
QStringList headerList;
headerList << QString::fromLocal8Bit("学号")
<< QString::fromLocal8Bit("姓名")
<< QString::fromLocal8Bit("语文")
<< QString::fromLocal8Bit("数学")
<< QString::fromLocal8Bit("英语") ;

ui->tableWidget->setColumnCount(headerList.size());
ui->tableWidget->setHorizontalHeaderLabels(headerList);

//表头中的元素可以进一步设置样式,比如是否能拉伸、宽度是否是固定
ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

效果如下:

image-20240321095208063

2.表格插入数据

QTableWidgetItem 是显示和编辑单元格数据的类。它可以包含文本、图标和数据,并提供了一系列方法来设置和获取这些数据。以下是一些 QTableWidgetItem 的主要特点和用法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
// 构造函数
QTableWidgetItem *item = new QTableWidgetItem("Hello");

// 设置/文本
item->setText("Hello");
QString text = item->text();

// 设置图标
QIcon icon(":/images/icon.png");
item->setIcon(icon);
QIcon itemIcon = item->icon();

// 保存自定义类型数据
stStudent stuInfo;
QVariant data;
data.setValue(stuInfo);
item->setData(Qt::UserRole, data);
QVariant data = item->data(Qt::UserRole);
stStudent value = data.value<stStudent>();

// 文本居中对齐
item->setTextAlignment(Qt::AlignCenter);
Qt::Alignment alignment = item->textAlignment();

// 允许选择和编辑
item->setFlags(Qt::ItemIsSelectable | Qt::ItemIsEditable);
Qt::ItemFlags itemFlags = item->flags();

void setBackground(const QBrush &brush)//设置背景色
void setCheckState(Qt::CheckState state)//设置CheckBox选中状态
void setFont(const QFont &font)//设置字体
void setForeground(const QBrush &brush)//设置前景色
void setSelected(bool select)//设置是否选中
void setSizeHint(const QSize &size)//设置尺寸大小
void setToolTip(const QString &toolTip)//设置提示信息,当鼠标移到表格时自动显示该信息

3.设置表格样式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
// 设置表格背景
tableWidget->setStyleSheet("QTableWidget { background-color: lightgray; }");

// 设置表头样式
tableWidget->horizontalHeader()->setStyleSheet("QHeaderView::section { background-color: gray; color: white; font-weight: bold; }");

// 设置单元格样式
tableWidget->setStyleSheet("QTableWidget::item { background-color: lightblue; font-weight: bold; }");

// 设置选中行样式
tableWidget->setStyleSheet("QTableWidget::item:selected { background-color: blue; color: white; }");

// 设置边界框样式
tableWidget->setStyleSheet("QTableWidget { border: 1px solid black; }");

// 设置交替背景色
tableWidget->setAlternatingRowColors(true);
tableWidget->setStyleSheet("QTableWidget { alternate-background-color: lightblue; }");

// 设置单元格边框颜色
tableWidget->setStyleSheet("QTableWidget { gridline-color: green; }");

// 设置单元格边框隐藏
tableWidget->setShowGrid(false);

3.1合并单元格

1
2
3
4
5
6
7
8
9
// 合并单元格
int row = ui->tableWidget->rowCount();
ui->tableWidget->insertRow(row);

QTableWidgetItem *pItem = new QTableWidgetItem("各科总分");
pItem->setTextAlignment(Qt::AlignCenter);

ui->tableWidget->setItem(row, 0, pItem);
ui->tableWidget->setSpan(row, 0, 1, 2);

image-20240321100339464

setSpan函数原型 void setSpan(int row, int column, int rowSpan, int columnSpan); 其中row表示行,column表示列,rowSpan 为行跨度,这里是1,columnSpan 为列跨度,这里是2。

4.与表格交互

4.1选择

表格的选择效果一般需要selectionBehavior 和 selectionMode 这两个属性搭配设置,可以通过函数调用setSelectionBehaviorsetSelectionMode 设置,也可以直接在Designer中设置。

4.2编辑

默认情况下,用户可以通过双击单元格来编辑其中的文本内容。也可以使用 setEditTriggers(QAbstractItemView::EditTriggers) 方法来设置编辑触发方式,如果编辑后的数据需要保存,还需处理数据保存逻辑:

4.3排序

可以通过设置SortingEnabled属性为true,使其支持排序,通过点击表头,实现按照列进行升序降序排序。

1
ui->tableWidget->setSortingEnabled(true);

还可以在页面中增加一个排序按钮,点击按钮后调用sortItems函数对某一列进行排序

1
2
3
4
5
6
void slotSortBtnClicked()
{
int column = 0; // 以第一列作为排序依据
Qt::SortOrder order = Qt::AscendingOrder; // 升序排序
tableWidget->sortItems(column, order);
}

4.4删除行

在页面中增加一个删除按钮,选中要删除的行,点击按钮后调用slotDeleteRow函数删除对应的一行

1
2
3
4
5
6
7
8
void slotDeleteRow()
{
int selectedRow = tableWidget->currentRow();
if (selectedRow >= 0)
{
tableWidget->removeRow(selectedRow);
}
}
image-20240321100855961

4.5复制行

在页面中增加一个复制按钮,选中要复制的行,点击按钮后调用copyRow函数复制当前选中行并将其添加到表格最后一行

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
void copyRow()
{
int selectedRow = tableWidget->currentRow();
if (selectedRow >= 0)
{
int targetRow = tableWidget->rowCount(); // 目标位置为当前行数
tableWidget->insertRow(targetRow); // 插入新行
for (int column = 0; column < tableWidget->columnCount(); ++column)
{
QTableWidgetItem *sourceItem = tableWidget->item(selectedRow, column);
if (sourceItem)
{
QTableWidgetItem *targetItem = new QTableWidgetItem(*sourceItem);
tableWidget->setItem(targetRow, column, targetItem); // 复制数据到目标行
}
}
}
}