QTableWidget完整操作

本文详细介绍了在Qt环境中对QTableWidget的各种操作,包括初始化、设置行列、指定列宽行高、添加删除行、设置无边框、隐藏表头、设置表头内容和颜色、设置单元格选中行为、插入勾选框和普通单元格、响应单元格双击事件、设置表格只读模式、滚动条控制、右键菜单、排序、列宽调整和单元格内容更改等。这些操作涵盖了QTableWidget在GUI应用开发中的常见需求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

#QTableWidget操作

Bug

1.当QTableWidget没有初始化完成,就获取不到表格的width,此时设置获取表格宽度或者列宽都不正确
2.QTableWidget在TabWidget 中时,需要TabWidget ->setCurrentIndex(i); 此QTableWidget在i这个页面中,才会初始化,否则还是获取不到表格width!!!

设置表格行列

tablewidget->setColumnCount(4);//设置表格列
tablewidget->setRowCount(4);//设置表格行

指定列宽、行高

tableWidget->setColumnWidth(3,200); 
tableWidget->setRowHeight(3,60); 

添加一行

int row = tableWidget->rowCount();//获取表格中当前总行数
tableWidget->setRowCount(row+1);//加一

清空表格

方法1:

tableWidget->setRowCount(0);

方法2

for (int k = tableWidget->rowCount() - 1; k >= 0; k--)
	tableWidget->removeRow(k);

删除某一行

tablewidget->removeRow(row);//int

设置无边框

tableWidget->setFrameShape(QFrame::NoFrame);

设置不显示格子线

tableWidget->setShowGrid(false);

去除选中虚线框

tableWidget->setFocusPolicy(Qt::NoFocus);

设置表头内容

QStringList header;
header<<tr("value")<<tr("value")<<tr("value");
tableWidget->setHorizontalHeaderLabels(header);

设置表头背景色

tableWidget_projectList->horizontalHeader()->setStyleSheet("QHeaderView::section{background:skyblue;}"); 

隐藏行、列表头

(展示或隐藏表格每行默认的行号)

//隐藏列表头
tableWidget->verticalHeader()->setVisible(false); 
//隐藏行表头
tableWidget->horizontalHeader()->setVisible(false); 

表头字体加粗

QFont font; font.setBold(true);
tableWidget->horizontalHeader()->setFont(font);

指定隐藏的列

tableWidget->hideColumn(0);

双击单元格信号

connect(tableWidget, SIGNAL(cellDoubleClicked(int, int)), this, SLOT(OnDBdoubleClicked(int, int)));

设置为可以选中多个目标

tableWidget>setSelectionMode(QAbstractItemView::ExtendedSelection); 
//QAbstractItemView::NoSelection 不能选择
//QAbstractItemView::SingleSelection 选中单个目标
//QAbstractItemView::MultiSelection 选中多个目标

选中一行

tableWidget->setSelectionBehavior(QAbstractItemView::SelectRows);
//QAbstractItemView::SelectItems  0  Selecting single items.选中单个单元格
//QAbstractItemView::SelectRows  1  Selecting only rows.选中一行
//QAbstractItemView::SelectColumns  2  Selecting only columns.选中一列

滚动条

ui->tableWidget->scrollToBottom(); //让滚动条滚动到最底部
ui->tableWidget->scrollToTop(); //让滚动条滚动到最顶部

表格为只读模式

tableWidget->setEditTriggers(QAbstractItemView::NoEditTriggers);
//表格为可更改模式
tableWidget->setEditTriggers(QAbstractItemView::AllEditTriggers);//表格全部可修改 
//QAbstractItemView::NoEditTriggers  0  不能对表格内容进行修改
//QAbstractItemView::CurrentChanged  1  任何时候都能对单元格修改
//QAbstractItemView::DoubleClicked  2  双击单元格
//QAbstractItemView::SelectedClicked  4  单击已选中的内容
//QAbstractItemView::EditKeyPressed  8  Editing starts when the platform edit key has been pressed over an item.
//QAbstractItemView::AnyKeyPressed  16  按下任意键就能修改
//QAbstractItemView::AllEditTriggers  31 以上条件全包括

单元格不可被选中

item->setFlags(item->flags()&~Qt::ItemIsSelectable);

更改表格单元格内容 信号

connect(tableWidget, SIGNAL(cellChanged(int, int)), this, SLOT(OnChange(int, int)));

表格插入勾选框

auto check = new QTableWidgetItem();
check->setCheckState(Qt::Checked);//check->setCheckState(Qt::Unchecked);	
check->setFlags(check->flags()&(~Qt::ItemIsEditable));//设置该勾选框这一列不能输入值
tableWidget->setItem(rowCount, 0, check);

表格插入普通单元格:单元格带不同属性

QTableWidgetItem *newItems = new QTableWidgetItem(data);//data为单元格内容
if (isBool)//是否加粗
{
QFont font; font.setBold(true);
newItems->setFont(font);
}
if (!isEnable)//单元格不可编辑
newItems->setFlags(newItems->flags()&(~Qt::ItemIsEditable));
tableWidget->setItem(row, col, newItems);		

表格插入:普通单元格(无属性设置)

tablewidget->setItem(row,col, new QTableWidgetItem(data));//data为字符串	
//表格插入:按钮			
QPushButton  *button = new QPushButton(QStringLiteral("按钮"));
connect(button, &QPushButton::clicked, this, &CenterWnd::OnShow);	
tableWidget->setCellWidget(row, col, button);

表格插入:按钮 按钮槽事件

	QPushButton *line = dynamic_cast<QPushButton*>(QObject::sender());
	QModelIndex index = tableWidget->indexAt(line->pos());
	int row = index.row();//当前按钮所在行列
	int col = index.column();

获取单元格内容

QString data = tableWidget->item(row, col)->text();
//获取单元格内容:若tableWidget->item(row, col)不存在该单元格,则会中断,最好先判断一下该单元格是否存在
if (item)
	return item->text();

合并单元格

tableWidget->setSpan(0, 0, 3, 1) # 其参数为: 开始行,开始列,行数,列数

记录滚动条

QScrollBar *scrolBar_;
scrolBar_ = tableWidget->verticalScrollBar();
int scrolBar_Pos_;    //当前行 所在位置	
scrolBar_Pos_ = scrolBar_->value();
scrolBar_->setValue(scrolBar_Pos_);//返回原来位置

右键菜单

tableWidget->setContextMenuPolicy(Qt::CustomContextMenu);//设置菜单项显示方式:右键会发送信号,还会捕捉到右键位置,并用pos存储
connect(tableWidget, SIGNAL(customContextMenuRequested(QPoint)), this, SLOT(OnDBMenu(QPoint)));
// 右键菜单:捕捉到右键信号
void  OnDBMenu(QPoint pos)
{
QMenu *MenuDB = new QMenu(this);//初始化菜单
QAction *ction_delete = new QAction(QStringLiteral("删除"), this);
QAction *action_change = new QAction(QStringLiteral("修改"), this);
connect(ction_delete, SIGNAL(triggered()), this, SLOT(OnDelete()));
connect(action_change, SIGNAL(triggered()), this, SLOT(OnChange()));
MenuDB->addAction(action_change);
MenuDB->addAction(ction_delete);
MenuDB->exec(QCursor::pos());//通过exec在pos()位置显示该菜单,pos()返回位置
}

排序:设置按照某列排序

QHeaderView *header = tableWidget->horizontalHeader();
header->setSortIndicator(0, Qt::AscendingOrder);
header->setSortIndicatorShown(true);

排序:点击表头,触发槽函数,根据选中点击的那一列排序

connect(tableWidget->horizontalHeader(), SIGNAL(sectionClicked(int)), this, SLOT(record_sortbycolunm(int)));
void BasicInfoUI::record_sortbycolunm(int col)
{
tableWidget->sortItems(col, Qt::AscendingOrder);
}

设置表格 列 样式:指定列

必须是表格初始化完成后使用才有效果

for (int i = begincol; i <= lastcol; i++)
{
if (mode == 0)//设置要根据内容使用宽度的列,会出现滚动条
table->horizontalHeader()->setSectionResizeMode(i, QHeaderView::ResizeToContents);
else if (mode == 1)//自动调整大小,填充可用空间,屏幕不够大时自动缩小,不会出现滚动条
table->horizontalHeader()->setSectionResizeMode(i, QHeaderView::Stretch);
else if (mode == 2)//用户无法调整表格列的宽度
table->horizontalHeader()->setSectionResizeMode(i, QHeaderView::Fixed);
}

设置表格 列 样式:不指定列

必须是表格初始化完成后使用才有效果

if (mode == 0)//设置要根据内容使用宽度的列,会出现滚动条
table->horizontalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);
else if (mode == 1)//自动调整大小,填充可用空间,屏幕不够大时自动缩小,不会出现滚动条
table->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
else if (mode == 2)//用户无法调整表格列的宽度
table->horizontalHeader()->setSectionResizeMode(QHeaderView::Fixed);
table->horizontalHeader()->setSectionResizeMode(QHeaderView::Interactive);//可手动拖拉列宽,可配合上面几种一起使用

表格单元格增加代理(详见QComBox 和 QLineEdit 代理笔记QItemDelegate):QLineEdit

QLineEdit *lineEdit = new QLineEdit();	
lineEdit->setStyleSheet("border:none");
lineEdit->setText(data);
tableWidget->setCellWidget(row, col, lineEdit);
setRegExpNum(lineEdit, editModel);
if (!isEnable)//不可编辑
	lineEdit->setEnabled(false);
if (isBool)//是否加粗
{
	QFont font; font.setBold(true);
	lineEdit->setFont(font);
}

表格单元格增加代理:QLineEdit值更改发出信号

void OnChangeItemLineEdit(const QString &string)
{
	QLineEdit *line = dynamic_cast<QLineEdit*>(QObject::sender());
	QModelIndex index = ui_.tableWidget_GYLC->indexAt(line->pos());
	int row = index.row();
	int col = index.column();
	OnChangeTable(row, col);
}
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值