- 公开视频 -> 链接点击跳转公开课程
- 博客首页 -> 链接点击跳转博客主页
目录
QTableWidget基础概念
QTableWidget
是 Qt 提供的一个功能强大的表格控件,适用于显示和管理二维数据。它内置了一个标准的模型(QTableWidgetItem
),使得数据的添加、删除和管理变得更加简单。
使用场景
- 显示和管理二维数据,如电子表格、任务列表等。
- 需要多列、多行显示数据时。
- 需要对数据进行排序、选择和编辑时。
常见样式
- 带表头的表格:显示表格的同时显示表头。
- 隐藏表头的表格:隐藏表头,只显示表格内容。
- 交替行颜色的表格:行背景颜色交替显示,提升可读性。
QTableWidget属性设置
一般属性(General)
- columnCount:定义表格的列数。
- rowCount:定义表格的行数。
- showGrid:控制是否显示表格的网格线。
- gridStyle:设置网格线的样式,例如实线、点线等。
- sortingEnabled:控制是否允许用户通过点击列标题来对数据进行排序。
选择属性(Selection)
- selectionBehavior:设置选择行为,可以是选择行、列或单个项目。
- selectionMode:定义选择模式,例如单选、多选等。
滚动与拖拽属性(Drag)
- dragDropMode:设置拖放模式,例如仅拖动、仅放置或两者都启用。
编辑属性(Editing)
- editTriggers:设置触发编辑的事件,例如单击、双击等。
- tabKeyNavigation:控制是否允许使用 Tab 键在单元格间导航。
外观属性(Appearance)
- alternatingRowColors:设置是否启用交替行颜色,以提高可读性。
- iconSize:设置表格中显示的图标大小。
- wordWrap:控制是否在单元格中自动换行。
表头属性(Headers)
- horizontalHeaderLabels 和 verticalHeaderLabels:通过逗号分隔的字符串列表设置水平和垂直表头的标签。
QTableWidget常见操作
创建和设置项
设置行数和列数
ui->tableWidget->setRowCount(5);
ui->tableWidget->setColumnCount(3);
设置表头标签
ui->tableWidget->setHorizontalHeaderLabels(QStringList() << "Name" << "Age" << "Occupation");
ui->tableWidget->setVerticalHeaderLabels(QStringList() << "Row 1" << "Row 2" << "Row 3" << "Row 4" << "Row 5");
访问和操作单元格
设置单元格项
QTableWidgetItem *item = new QTableWidgetItem("John Doe");
ui->tableWidget->setItem(0, 0, item);
获取单元格项
void MainWindow::on_pushButton_clicked()
{
QTableWidgetItem *item = ui->tableWidget->item(0, 0);
QString text = item->text();
qDebug() << text;
}
移除单元格项
QTableWidgetItem *item = ui->tableWidget->takeItem(0, 0);
delete item;
清除所有表格项和标题
ui->tableWidget->clear();
修改单元格属性
设置自定义控件
QPushButton *button = new QPushButton("Click Me");
ui->tableWidget->setCellWidget(0, 1, button);
获取自定义控件
QWidget *widget = ui->tableWidget->cellWidget(0, 1);
设置列宽和行高
ui->tableWidget->setColumnWidth(0, 150);
ui->tableWidget->setRowHeight(0, 50);
选择和操作
选中指定行和列
ui->tableWidget->selectRow(1);
ui->tableWidget->selectColumn(2);
获取和设置当前选中项
QTableWidgetItem *currentItem = ui->tableWidget->currentItem();
ui->tableWidget->setCurrentItem(currentItem);
信号处理
项被点击
connect(ui->tableWidget, &QTableWidget::itemClicked, this, [](QTableWidgetItem *item) {
qDebug() << "Item clicked:" << item->text();
});
项被双击
connect(ui->tableWidget, &QTableWidget::itemDoubleClicked, this, [](QTableWidgetItem *item) {
qDebug() << "Item double clicked:" << item->text();
});
项内容改变
connect(ui->tableWidget, &QTableWidget::itemChanged, this, [](QTableWidgetItem *item) {
qDebug() << "Item changed:" << item->text();
});
单元格被点击
connect(ui->tableWidget, &QTableWidget::cellClicked, this, [](int row, int column) {
qDebug() << "Cell clicked at row:" << row << "column:" << column;
});
单元格被双击
connect(ui->tableWidget, &QTableWidget::cellDoubleClicked, this, [](int row, int column) {
qDebug() << "Cell double clicked at row:" << row << "column:" << column;
});
排序和查找
启用排序功能
ui->tableWidget->setSortingEnabled(true);
对项进行排序
ui->tableWidget->sortItems(0, Qt::AscendingOrder); // 按第一列升序排序
查找项
QList<QTableWidgetItem*> foundItems = ui->tableWidget->findItems("John", Qt::MatchContains);
for (QTableWidgetItem *item : foundItems) {
qDebug() << "Found item:" << item->text();
}
QTableWidget示例代码
完整示例
ui->tableWidget->setColumnCount(2);
ui->tableWidget->setHorizontalHeaderLabels(QStringList() << "进程名称"<< "进程标识");
void MainWindow::on_pushButton_28_clicked()
{
int rowCount = ui->tableWidget->rowCount();
ui->tableWidget->insertRow(rowCount);
ui->tableWidget->setItem(rowCount, 0, new QTableWidgetItem("notepad"));
ui->tableWidget->setItem(rowCount, 1, new QTableWidgetItem("1024"));
}
void MainWindow::on_pushButton_30_clicked()
{
QList<QTableWidgetItem*> items = ui->tableWidget->selectedItems();
for (int var = 0; var < items.count(); ++var) {
ui->tableWidget->removeRow(items[var]->row());
}
}
void MainWindow::on_pushButton_31_clicked()
{
QList<QTableWidgetItem*> items = ui->tableWidget->selectedItems();
for (int var = 0; var < items.count(); ++var) {
ui->tableWidget->takeItem(items[var]->row(), items[var]->column());
}
}
void MainWindow::on_pushButton_29_clicked()
{
QList<QTableWidgetItem*> items = ui->tableWidget->selectedItems();
for (int var = 0; var < items.count(); ++var) {
items[var]->setText("456");
}
}