1.初始化表格
开发时一般在QT Designer 中拖拽一个QTableWidget到页面上,设置好布局后在UI页面对应的cpp文件中对表格进行操作即可,不过QTableWidget此时是空白的
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);
|
效果如下:

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) 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);
|

setSpan函数原型 void setSpan(int row, int column, int rowSpan, int columnSpan);
其中row表示行,column表示列,rowSpan 为行跨度,这里是1,columnSpan 为列跨度,这里是2。
4.与表格交互
4.1选择
表格的选择效果一般需要selectionBehavior 和 selectionMode 这两个属性搭配设置,可以通过函数调用setSelectionBehavior
、setSelectionMode
设置,也可以直接在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); } }
|
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); } } } }
|