【QT-3】tableWidget控件

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

QT tableWidget的简单使用 - 缘随风烬 - 博客园

 QTableWidget开发知识点_qtablewidget添加行_b0b119的博客-CSDN博客

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值