1、在**.ui文件中拖入tableWidget控件
2、示例代码
表格样式:
//Table Widget控件
//设置列数
ui->tableWidget->setColumnCount(5);
//表头高度
ui->tableWidget->horizontalHeader()->setMinimumHeight(40);
QString qssTV = "QTableWidget::item:hover{background-color:rgb(92,188,227,200)}"
"QTableWidget::item:selected{background-color:#1B89A1}"
"QHeaderView::section,QTableCornerButton:section{ \
padding:3px; margin:0px; color:#DCDCDC; border:1px solid #242424; \
border-left-width:0px; border-right-width:1px; border-top-width:0px; border-bottom-width:1px; \
background:qlineargradient(spread:pad,x1:0,y1:0,x2:0,y2:1,stop:0 #646464,stop:1 #525252); }"
"QTableWidget{background-color:rgb(211, 211, 211);border:2px;}";
//ui->tableWidget->setShowGrid(true); //设置显示格子线
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows); //整行选中的方式
ui->tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers); //禁止编辑
//ui->tableWidget->horizontalHeader()->setStretchLastSection(true); //行头自适应表格
ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);//表头等宽
ui->tableWidget->horizontalHeader()->setFont(QFont("song", 12));
//点击表时不对表头行光亮(获取焦点)
ui->tableWidget->horizontalHeader()->setHighlightSections(false);
//设置表头字体加粗
QFont font = ui->tableWidget->horizontalHeader()->font();
font.setBold(true);
ui->tableWidget->horizontalHeader()->setFont(font);
ui->tableWidget->horizontalHeader()->setStyleSheet("QHeaderView::section{background:lightblue;}"); //skyblue设置表头背景色
ui->tableWidget->setStyleSheet("selection-background-color:lightblue;"); //设置选中背景色
ui->tableWidget->setStyleSheet(qssTV);
ui->tableWidget->horizontalHeader()->setHighlightSections(false); //点击表头时不对表头光亮
ui->tableWidget->setSelectionMode(QAbstractItemView::ContiguousSelection);//选中模式为多行选中
ui->tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
//所有单元格的字体 设置成一样
ui->tableWidget->setFont(QFont("black", 12));
//隔行变色
ui->tableWidget->setAlternatingRowColors(true);
//表头
QTableWidgetItem *item0 = new QTableWidgetItem;
QTableWidgetItem *item1 = new QTableWidgetItem;
QTableWidgetItem *item2 = new QTableWidgetItem;
QTableWidgetItem *item3 = new QTableWidgetItem;
QTableWidgetItem *item4 = new QTableWidgetItem;
//设置显示内容
item0->setText("Length");
item1->setText("Width");
item2->setText("Height");
item3->setText("ExternalVolume");
item4->setText("IntegralVolume");
//设置水平表头
ui->tableWidget->setHorizontalHeaderItem(0, item0);
ui->tableWidget->setHorizontalHeaderItem(1, item1);
ui->tableWidget->setHorizontalHeaderItem(2, item2);
ui->tableWidget->setHorizontalHeaderItem(3, item3);
ui->tableWidget->setHorizontalHeaderItem(4, item4);
//ui->tableWidget->setHorizontalHeaderLabels(QStringList() << "id" << "Length" << "Width" << "Height" << "ExternalVolume" << "IntegralVolume");
//设置行数
//ui->tableWidget->setRowCount(5);
表格插入数据:
QString l = ui->lineEdit_ObjectLength->text().toUtf8();
QString w = ui->lineEdit_ObjectWidth->text().toUtf8();
QString h = ui->lineEdit_ObjectHeight->text().toUtf8();
QString ev = ui->lineEdit_ObjectExternalVolume->text().toUtf8();
QString iv = ui->lineEdit_ObjectIntegralVolume->text().toUtf8();
//在末尾插入数据
int curRow = ui->tableWidget->rowCount();
ui->tableWidget->insertRow(curRow);
QTableWidgetItem* Length = new QTableWidgetItem;
QTableWidgetItem* Width = new QTableWidgetItem;
QTableWidgetItem* Height = new QTableWidgetItem;
QTableWidgetItem* ExternalVolume = new QTableWidgetItem;
QTableWidgetItem* IntegralVolume = new QTableWidgetItem;
Length->setText(l);
Width->setText(w);
Height->setText(h);
ExternalVolume->setText(ev);
IntegralVolume->setText(iv);
ui->tableWidget->setItem(curRow, 0, Length);
ui->tableWidget->setItem(curRow, 1, Width);
ui->tableWidget->setItem(curRow, 2, Height);
ui->tableWidget->setItem(curRow, 3, ExternalVolume);
ui->tableWidget->setItem(curRow, 4, IntegralVolume);
单元格内容居中显示:
int rowCount = ui->tableWidget->rowCount();
int columCount = ui->tableWidget->columnCount();
for (int row = 0; row < rowCount; row++)
{
for (int colum = 0; colum < columCount; colum++)
{
QTableWidgetItem* item = ui->tableWidget->item(row, colum);
if (item != nullptr)
{
item->setTextAlignment(Qt::AlignCenter);
}
}
}
3、运行效果
4、小知识点
插入一行:
//获取行数
row = ui->tableWidget_3->rowCount();
ui->tableWidget_3->setRowCount(row + 1);
清除:
//只清除表中数据,不清除表头内容
ui->tableWidget_3->clearContents();
//清除所有可见数据(包括表头),行还在
ui->tableWidget_3->clear();
//连行也清除掉
ui->tableWidget_3->setRowCount(0);
删除:
//当前选中行
row = ui->tableWidget_3->currentItem()->row();
ui->tableWidget_3->removeRow(row);
//判断是否选中一行
bool focus = ui->tableWidget_3->isItemSelected(ui->tableWidget_3->currentItem());
获取列数:
ui->tableWidget_3->columnCount()
5、tablewidget信号与槽
信号函数 | 功 能 |
---|---|
cellClicked(int row,int column) | 当某个单元格被点击时,触发该信号,row 和 columu 就是被点击的单元格的位置。 |
cellDoubleClicked(int row,int column) | 当某个单元格被双击时,触发该信号,row 和 columu 就是被点击的单元格的位置。 |
cellEntered(int row,int column) | 当某个单元格被按下时,触发该信号,row 和 columu 就是被点击的单元格的位置。 |
cellChanged(int row, int column) | 当某个单元格中的数据发生改变时,触发该信号,row 和 columu 就是被改变的单元格的位置。 |
itemClicked(QTableWidgetItem *item) | 当某个单元格被点击时,触发该信号,item 就是被点击的单元格。 |
itemDoubleClicked(QTableWidgetItem *item) | 当某个单元格被双击时,触发该信号,item 就是被双击的单元格。 |
itemEntered(QTableWidgetItem *item) | 当某个单元格被按下时,触发该信号,item 就是被按下的单元格。 |
itemChanged(QTableWidgetItem *item) | 当某个单元格中的数据发生改变时,触发该信号,item 就是被改变的单元格。 |
槽函数 功 能 clear() 删除表格中所有单元格的内容,包括表头。 clearContents() 不删除表头,仅删除表格中数据区内所有单元格的内容, insertColumn(int column) 在表格第 column 列的位置插入一个空列。 insertRow(int row) 在表格第 row 行的位置插入一个空行。 removeColumn(int column) 删除表格中的第 column 列,该列的所有单元格也会一并删除。 removeRow(int row) 删除表格中的第 row 行,该行的所有单元格也会一并删除。 scrollToItem(const QTableWidgetItem *item, QAbstractItemView::ScrollHint hint = EnsureVisible) 滑动到指定的单元格。
示例:
connect(ui->tableWidget, &QTableWidget::cellChanged, [=](int row, int column) {
QTableWidgetItem* item = ui->tableWidget->item(row, column);
QString newValue = item->text();
qDebug() << row << column << newValue;
});
参考链接 Qt QTableWidget表格控件的用法(非常详细)
6、错误解决
QTableWidget: cannot insert an item that is already owned by another QTableWidget
原代码:
QTableWidgetItem* feed_x = new QTableWidgetItem;
ui->tableWidget_3->setRowCount(table_list.count() / 2);
for (int t = 0; t < table_list.count()/2; t++)
{
for (int g = 0; g < ui->tableWidget_3->columnCount(); g++)
{
QString table_x = table_list.at(t * ui->tableWidget_3->columnCount() + g).simplified();
feed_x->setText(table_x);
ui->tableWidget_3->setItem(t, g, feed_x);
}
}
原因分析:
QTableWidget 在 setItem时,传入的是 QTableWidgetItem 项目的地址,并不是只是简单的添加文本信息显示之后就结束了,修改这个项目的内容时,QTableWidget中对应的QTableWidgetItem也会发生变化。
QTableWidget 的 setItem 是在为QTableWidget 与 QTableWidgetItem建立链接,而非为了显示数据。所以每个item都需要独立的去分配内存。
修改后代码:
ui->tableWidget_3->setRowCount(table_list.count() / 2);
for (int t = 0; t < table_list.count()/2; t++)
{
for (int g = 0; g < ui->tableWidget_3->columnCount(); g++)
{
QTableWidgetItem* feed_x = new QTableWidgetItem;
QString table_x = table_list.at(t * ui->tableWidget_3->columnCount() + g).simplified();
feed_x->setText(table_x);
ui->tableWidget_3->setItem(t, g, feed_x);
}
}
参考链接 QTableWidget表头、内容字体大小、颜色、背景颜色等设置_youandme520的博客-CSDN博客_qtablewidget设置表头
QT之QTableWidget控件_大草原的小灰灰的博客-CSDN博客_qt qtablewidget