目录
一.背景描述
在日常的开发当中,可能会在原生的QTableWidget加上一些针对产品的特殊功能,例如想要实现在表格里既可以勾选,也可以编辑的功能,如图(1)所示:
当然QTableWidget本身便自带复选框可编辑功能,为什么要多此一举呢?
确实,QTableWidget自带的setEditTriggers接口便可实现可编辑,但用来不是很方便,如图(2)所示:
有两点让我用起来感觉不大好的地方:
1.在进行了勾选动作后无法直接触发可编辑行为;
2.进行编辑时编辑框会超出单元格所在区域;
主要还是第一点吧,用起来感觉让人很不爽,于是乎进行自定义实现。
二.实现概述
那么在本文中实现是怎样的呢?
1.首先说复选框功能,添加复选框功能还是用QTableWidgetItem自带的setCheckState接口进行实现;
2.然后是可编辑功能,在本文中是采用了双击触发行为进行触发可编辑功能。思路就是在对单元格进行双击时,在单元格对应的位置生成一个QLineEdit以实现可编辑功能,当然这个QLineEdit可以根据需要进行相应的改造以更方便实现我们想要的功能。
三.具体实现
3.1 QTableWidget复选框功能实现:
for (int row = 0, index = 0; row < row_count; row++) {
for (int col = 0; col < TABLE_COL_INDEX::COL_NUM; col++) {
QString text = QString("Item_%1-%2").arg(row).arg(col);
QTableWidgetItem *item = new QTableWidgetItem(text);
table_widget_->setItem(row, col, item);
item->setCheckState(Qt::Unchecked);
}
}
针对每个QTableWidgetItem进行调用setCheckState进行设置即可实现。
3.2 可编辑功能实现
可编辑功能实现稍微会复杂一点,具体如下述步骤:
1.首先需要对QTableWidget的双击信号进行捕获
connect(table_widget_, &QTableWidget::itemDoubleClicked, this,
&QTableWidget_Test::TableWidgetItemDoubleClickedSlot);
2.在双击信号关联槽里进行生成一个QLineEdit编辑框
row_record_ = item->row();
col_record_ = item->column();
line_edit_ = new MyLineEdit(item->text(), this);
table_widget_->setCellWidget(row_record_, col_record_, line_edit_);
4.然后为了让显示的编辑框完美的覆盖原单元格的位置,我们需要获取原单元格的位置大小,然后对编辑框的位置尺寸做调整
QRect rec = table_widget_->visualItemRect(item);
line_edit_->setGeometry(rec);
5.为了实现在编辑完成后把编辑框里的内容替换到原单元格内,我们还需要对编辑完成的信号做一个处理
connect(line_edit_, &MyLineEdit::editingFinished, this, &QTableWidget_Test::TableWidgetItemEditingFinishSlot);
6.另外,我们可能想要在编辑框失去焦点时也认为是编辑完成了,那么我们还需要对焦点信号进行捕获
connect(line_edit_, &MyLineEdit::FocusOutSignal, this, &QTableWidget_Test::TableWidgetItemEditingFinishSlot);
7.在编辑完成触发editingFinished信号时,我们就可以在绑定的槽进行编辑框到原单元格内容的替换了
table_widget_->item(row_record_, col_record_)->setText(line_edit_->text());
8.完成以上行为后,我们还需要把该编辑框进行去除或者隐藏掉(如果还需要重新使用的话),以便显示QTableWidget本来的面貌
table_widget_->removeCellWidget(row_record_, col_record_);
完成以上一系列步骤后便可实现图(1)的效果。
四.完整项目下载
如需下载本项目完整Demo,请点击下方链接:
https://download.csdn.net/download/tormi21c/85161324https://download.csdn.net/download/tormi21c/85161324 本项目是基于VS2019+QT5.15.2环境进行编写,大家可根据自身开发环境进行相应的修改,如有疑问可在评论区提出,如有不足之处请多包含,如觉得对您有所帮助麻烦点个赞^_^,谢谢!。