Qt版本:6.8.0
该类适用于表格模型/视图
QTableWidget
是 Qt 框架中用于显示和编辑表格数据的一个控件(类),属于 Qt Widgets 模块。它为开发者提供了一个基于单元格的二维表格视图,每个单元格都可以包含文本、图标、复选框、甚至自定义控件(如按钮、下拉框等)。
显示二维表格数据
适合展示和编辑类似 Excel 的数据表格,每个单元格都可以独立设置内容和属性。
支持单元格编辑
用户可以直接在表格中编辑单元格内容,支持文本、数字、复选框等多种数据类型。
支持单元格控件嵌入
可以在单元格中嵌入自定义控件(如按钮、进度条、下拉框等),实现丰富的交互。
支持行、列、单元格的选择和操作
支持多选、区域选择、拖拽、排序、插入、删除等操作。
信号与槽机制
提供丰富的信号(如单元格点击、内容改变、选中变化等),方便与业务逻辑联动。
可自定义表头和行头
可以设置表头、行头的文本、图标、样式等。
支持数据导入导出
通过遍历单元格内容,可以方便地实现数据的导入导出。
QTableWidget(QWidget *parent = nullptr)
parent
父窗口指针(可选)QTableWidget *table = new QTableWidget();
QTableWidget(int rows, int columns, QWidget *parent = nullptr)
rows
行数,columns
列数,parent
父窗口指针(可选)QTableWidget *table = new QTableWidget(3, 4);
virtual ~QTableWidget()
QWidget *cellWidget(int row, int column) const
row
行,column
列QWidget *w = table->cellWidget(0, 1);
void closePersistentEditor(QTableWidgetItem *item)
item
目标项table->closePersistentEditor(item);
int column(const QTableWidgetItem *item) const
item
目标项int col = table->column(item);
int columnCount() const
int cols = table->columnCount();
int currentColumn() const
int col = table->currentColumn();
QTableWidgetItem *currentItem() const
QTableWidgetItem *item = table->currentItem();
int currentRow() const
int row = table->currentRow();
void editItem(QTableWidgetItem *item)
item
目标项table->editItem(item);
QList findItems(const QString &text, Qt::MatchFlags flags) const
text
查找文本,flags
匹配方式(如Qt::MatchExactly, Qt::MatchContains等)auto items = table->findItems("Alice", Qt::MatchExactly);
QTableWidgetItem *horizontalHeaderItem(int column) const
column
列号QTableWidgetItem *header = table->horizontalHeaderItem(0);
QModelIndex indexFromItem(const QTableWidgetItem *item) const
item
目标项QModelIndex idx = table->indexFromItem(item);
bool isPersistentEditorOpen(QTableWidgetItem *item) const
item
目标项bool open = table->isPersistentEditorOpen(item);
QTableWidgetItem *item(int row, int column) const
row
行,column
列QTableWidgetItem *item = table->item(1, 2);
QTableWidgetItem *itemAt(const QPoint &point) const
point
坐标点QTableWidgetItem *item = table->itemAt(QPoint(50, 50));
QTableWidgetItem *itemAt(int ax, int ay) const
ax
x坐标,ay
y坐标QTableWidgetItem *item = table->itemAt(50, 50);
QTableWidgetItem *itemFromIndex(const QModelIndex &index) const
index
模型索引QTableWidgetItem *item = table->itemFromIndex(index);
const QTableWidgetItem *itemPrototype() const
const QTableWidgetItem *proto = table->itemPrototype();
QList items(const QMimeData *data) const
data
QMimeData*// 通常在拖放事件中使用
void openPersistentEditor(QTableWidgetItem *item)
item
目标项table->openPersistentEditor(item);
void removeCellWidget(int row, int column)
row
行,column
列table->removeCellWidget(0, 1);
int row(const QTableWidgetItem *item) const
item
目标项int row = table->row(item);
int rowCount() const
int rows = table->rowCount();
QList selectedItems() const
auto items = table->selectedItems();
QList selectedRanges() const
auto ranges = table->selectedRanges();
void setCellWidget(int row, int column, QWidget *widget)
row
行,column
列,widget
控件table->setCellWidget(0, 1, new QPushButton("按钮"));
void setColumnCount(int columns)
columns
列数table->setColumnCount(5);
void setCurrentCell(int row, int column)
row
行,column
列table->setCurrentCell(1, 2);
void setCurrentCell(int row, int column, QItemSelectionModel::SelectionFlags command)
row
行,column
列,command
选择标志table->setCurrentCell(1, 2, QItemSelectionModel::Select);
void setCurrentItem(QTableWidgetItem *item)
item
目标项table->setCurrentItem(item);
void setCurrentItem(QTableWidgetItem *item, QItemSelectionModel::SelectionFlags command)
item
目标项,command
选择标志table->setCurrentItem(item, QItemSelectionModel::Select);
void setHorizontalHeaderItem(int column, QTableWidgetItem *item)
column
列号,item
表头项table->setHorizontalHeaderItem(0, new QTableWidgetItem("姓名"));
void setHorizontalHeaderLabels(const QStringList &labels)
labels
标签列表table->setHorizontalHeaderLabels(QStringList() << "姓名" << "年龄");
void setItem(int row, int column, QTableWidgetItem *item)
row
行,column
列,item
项table->setItem(0, 0, new QTableWidgetItem("Alice"));
void setItemPrototype(const QTableWidgetItem *item)
item
原型项table->setItemPrototype(new QTableWidgetItem("原型"));
void setRangeSelected(const QTableWidgetSelectionRange &range, bool select)
range
区域,select
是否选择QTableWidgetSelectionRange range(0, 0, 1, 1);
table->setRangeSelected(range, true);
void setRowCount(int rows)
rows
行数table->setRowCount(10);
void setVerticalHeaderItem(int row, QTableWidgetItem *item)
row
行号,item
表头项table->setVerticalHeaderItem(0, new QTableWidgetItem("第一行"));
void setVerticalHeaderLabels(const QStringList &labels)
labels
标签列表table->setVerticalHeaderLabels(QStringList() << "A" << "B" << "C");
void sortItems(int column, Qt::SortOrder order = Qt::AscendingOrder)
column
列号,order
排序顺序table->sortItems(1, Qt::DescendingOrder);
QTableWidgetItem *takeHorizontalHeaderItem(int column)
column
列号QTableWidgetItem *header = table->takeHorizontalHeaderItem(0);
QTableWidgetItem *takeItem(int row, int column)
row
行,column
列QTableWidgetItem *item = table->takeItem(0, 0);
QTableWidgetItem *takeVerticalHeaderItem(int row)
row
行号QTableWidgetItem *header = table->takeVerticalHeaderItem(0);
QTableWidgetItem *verticalHeaderItem(int row) const
row
行号QTableWidgetItem *header = table->verticalHeaderItem(0);
int visualColumn(int logicalColumn) const
logicalColumn
逻辑列号int vcol = table->visualColumn(1);
QRect visualItemRect(const QTableWidgetItem *item) const
item
目标项QRect rect = table->visualItemRect(item);
int visualRow(int logicalRow) const
logicalRow
逻辑行号int vrow = table->visualRow(2);
void clear()
table->clear();
void clearContents()
table->clearContents();
void insertColumn(int column)
column
插入位置table->insertColumn(1);
void insertRow(int row)
row
插入位置table->insertRow(2);
void removeColumn(int column)
column
列号table->removeColumn(0);
void removeRow(int row)
row
行号table->removeRow(1);
void scrollToItem(const QTableWidgetItem *item, QAbstractItemView::ScrollHint hint = EnsureVisible)
item
目标项,hint
滚动方式table->scrollToItem(item, QAbstractItemView::PositionAtCenter);
void cellActivated(int row, int column)
row
行,column
列connect(table, &QTableWidget::cellActivated, [](int row, int col){
qDebug() << "Cell activated:" << row << col;
});
void cellChanged(int row, int column)
row
行,column
列connect(table, &QTableWidget::cellChanged, [](int row, int col){
qDebug() << "Cell changed:" << row << col;
});
void cellClicked(int row, int column)
row
行,column
列connect(table, &QTableWidget::cellClicked, [](int row, int col){
qDebug() << "Cell clicked:" << row << col;
});
void cellDoubleClicked(int row, int column)
row
行,column
列connect(table, &QTableWidget::cellDoubleClicked, [](int row, int col){
qDebug() << "Cell double clicked:" << row << col;
});
void cellEntered(int row, int column)
row
行,column
列connect(table, &QTableWidget::cellEntered, [](int row, int col){
qDebug() << "Cell entered:" << row << col;
});
void cellPressed(int row, int column)
row
行,column
列connect(table, &QTableWidget::cellPressed, [](int row, int col){
qDebug() << "Cell pressed:" << row << col;
});
void currentCellChanged(int currentRow, int currentColumn, int previousRow, int previousColumn)
currentRow
,currentColumn
,previousRow
,previousColumn
connect(table, &QTableWidget::currentCellChanged, [](int curRow, int curCol, int preRow, int preCol){
qDebug() << "Current cell changed:" << curRow << curCol << preRow << preCol;
});
void currentItemChanged(QTableWidgetItem *current, QTableWidgetItem *previous)
current
当前项,previous
前一项connect(table, &QTableWidget::currentItemChanged, [](QTableWidgetItem *cur, QTableWidgetItem *pre){
qDebug() << "Current item changed:" << cur << pre;
});
void itemActivated(QTableWidgetItem *item)
item
目标项connect(table, &QTableWidget::itemActivated, [](QTableWidgetItem *item){
qDebug() << "Item activated:" << item->text();
});
void itemChanged(QTableWidgetItem *item)
item
目标项connect(table, &QTableWidget::itemChanged, [](QTableWidgetItem *item){
qDebug() << "Item changed:" << item->text();
});
void itemClicked(QTableWidgetItem *item)
item
目标项connect(table, &QTableWidget::itemClicked, [](QTableWidgetItem *item){
qDebug() << "Item clicked:" << item->text();
});
void itemDoubleClicked(QTableWidgetItem *item)
item
目标项connect(table, &QTableWidget::itemDoubleClicked, [](QTableWidgetItem *item){
qDebug() << "Item double clicked:" << item->text();
});
void itemEntered(QTableWidgetItem *item)
item
目标项connect(table, &QTableWidget::itemEntered, [](QTableWidgetItem *item){
qDebug() << "Item entered:" << item->text();
});
void itemPressed(QTableWidgetItem *item)
item
目标项connect(table, &QTableWidget::itemPressed, [](QTableWidgetItem *item){
qDebug() << "Item pressed:" << item->text();
});
void itemSelectionChanged()
connect(table, &QTableWidget::itemSelectionChanged, [](){
qDebug() << "Selection changed";
});
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv[])
{
QApplication app(argc, argv);
// 创建 QTableWidget,3行3列
QTableWidget table(3, 3);
table.setWindowTitle("QTableWidget 示例");
table.resize(500, 300);
// 设置表头
table.setHorizontalHeaderLabels(QStringList() << "姓名" << "年龄" << "操作");
table.setVerticalHeaderLabels(QStringList() << "A" << "B" << "C");
// 添加数据
table.setItem(0, 0, new QTableWidgetItem("Alice"));
table.setItem(0, 1, new QTableWidgetItem("23"));
table.setItem(1, 0, new QTableWidgetItem("Bob"));
table.setItem(1, 1, new QTableWidgetItem("30"));
table.setItem(2, 0, new QTableWidgetItem("Carol"));
table.setItem(2, 1, new QTableWidgetItem("28"));
// 设置单元格属性
QTableWidgetItem *item = new QTableWidgetItem("只读项");
item->setFlags(item->flags() & ~Qt::ItemIsEditable); // 只读
item->setBackground(Qt::yellow);
item->setTextAlignment(Qt::AlignCenter);
table.setItem(0, 2, item);
// 在单元格中嵌入控件(如按钮)
QPushButton *btn = new QPushButton("点击我");
table.setCellWidget(1, 2, btn);
// 设置复选框
QTableWidgetItem *checkItem = new QTableWidgetItem("已完成");
checkItem->setFlags(checkItem->flags() | Qt::ItemIsUserCheckable);
checkItem->setCheckState(Qt::Unchecked);
table.setItem(2, 2, checkItem);
// 响应单元格点击信号
QObject::connect(&table, &QTableWidget::cellClicked, [&](int row, int col){
QTableWidgetItem *clickedItem = table.item(row, col);
QString msg = QString("点击了第%1行第%2列").arg(row).arg(col);
if (clickedItem)
msg += "\n内容: " + clickedItem->text();
QMessageBox::information(&table, "单元格点击", msg);
});
// 响应按钮点击
QObject::connect(btn, &QPushButton::clicked, [&](){
QMessageBox::information(&table, "按钮", "你点击了表格中的按钮!");
});
// 自动调整列宽
table.horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
table.show();
return app.exec();
}