基本用法
创建和设置
#include <QTableWidget>
QTableWidget *tableWidget = new QTableWidget(rows, columns, parent);
-
rows 和 columns 分别指定表格的行数和列数。
-
parent 是父窗口部件,通常是一个 QWidget 或 QMainWindow。
设置表头
tableWidget->setHorizontalHeaderLabels(QStringList() << "Column 1" << "Column 2");
tableWidget->setVerticalHeaderLabels(QStringList() << "Row 1" << "Row 2");
-
setHorizontalHeaderLabels 设置水平表头。
-
setVerticalHeaderLabels 设置垂直表头
添加数据
QTableWidgetItem *item = new QTableWidgetItem("Data");
tableWidget->setItem(row, column, item);
- setItem 方法用于在指定行和列设置数据项。
获取数据
QTableWidgetItem *item = tableWidget->item(row, column);
QString text = item->text();
-
item 方法获取指定位置的 QTableWidgetItem。
-
text 方法获取单元格的文本内容。
常用功能
设置单元格属性
item->setTextAlignment(Qt::AlignCenter); // 设置文本对齐方式
item->setBackground(Qt::yellow); // 设置背景颜色
item->setForeground(Qt::red); // 设置前景色(文本颜色)
item->setFlags(item->flags() | Qt::ItemIsEditable); // 设置单元格可编辑
调整行高和列宽
tableWidget->setRowHeight(row, height);
tableWidget->setColumnWidth(column, width);
选择模式
tableWidget->setSelectionMode(QAbstractItemView::SingleSelection); // 单选
tableWidget->setSelectionMode(QAbstractItemView::MultiSelection); // 多选
tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); // 选择整行
tableWidget->setSelectionBehavior(QAbstractItemView::SelectColumns); // 选择整列
排序
tableWidget->setSortingEnabled(true);
- 启用排序功能后,用户可以点击表头进行排序。
信号与槽
单元格内容改变
connect(tableWidget, &QTableWidget::cellChanged, [](int row, int column) {
qDebug() << "Cell changed at row:" << row << "column:" << column;
});
单元格被点击
connect(tableWidget, &QTableWidget::cellClicked, [](int row, int column) {
qDebug() << "Cell clicked at row:" << row << "column:" << column;
});
单元格被双击
connect(tableWidget, &QTableWidget::cellDoubleClicked, [](int row, int column) {
qDebug() << "Cell double-clicked at row:" << row << "column:" << column;
});
高级功能
自定义单元格控件
QComboBox *comboBox = new QComboBox();
comboBox->addItem("Option 1");
comboBox->addItem("Option 2");
tableWidget->setCellWidget(row, column, comboBox);
- setCellWidget 方法可以在单元格中嵌入其他控件,如 QComboBox、QSpinBox 等。
合并单元格
tableWidget->setSpan(row, column, rowSpan, columnSpan);
- setSpan 方法用于合并单元格,rowSpan 和 columnSpan 分别指定合并的行数和列数。
自定义表头
QHeaderView *header = tableWidget->horizontalHeader();
header->setSectionResizeMode(QHeaderView::Stretch); // 自动调整列宽
header->setDefaultAlignment(Qt::AlignCenter); // 设置表头文本对齐方式
注意事项
-
QTableWidget 适合处理小型数据集,对于大型数据集,建议使用 QTableView 和自定义模型。
-
频繁操作表格数据时,建议使用 blockSignals(true) 来暂时禁用信号,以提高性能。
示例代码
#include <QApplication>
#include <QTableWidget>
#include <QTableWidgetItem>
#include <QHeaderView>
int main(int argc, char *argv[]) {
QApplication app(argc, argv);
QTableWidget tableWidget(3, 3);
tableWidget.setHorizontalHeaderLabels(QStringList() << "A" << "B" << "C");
tableWidget.setVerticalHeaderLabels(QStringList() << "1" << "2" << "3");
for (int row = 0; row < 3; ++row) {
for (int col = 0; col < 3; ++col) {
QTableWidgetItem *item = new QTableWidgetItem(QString("R%1C%2").arg(row + 1).arg(col + 1));
tableWidget.setItem(row, col, item);
}
}
tableWidget.setSortingEnabled(true);
tableWidget.show();
return app.exec();
}
总结
QTableWidget 是一个功能强大且易于使用的表格控件,适合处理小型数据集。通过灵活的设置和信号槽机制,可以实现丰富的交互功能。对于更复杂的场景,建议结合 QTableView 和自定义模型来实现。