QTableWiddget实现复选框和自定义编辑功能

目录

一.背景描述

二.实现概述

三.具体实现

3.1 QTableWidget复选框功能实现:

3.2 可编辑功能实现

四.完整项目下载


一.背景描述

在日常的开发当中,可能会在原生的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/85161324icon-default.png?t=M3C8https://download.csdn.net/download/tormi21c/85161324        本项目是基于VS2019+QT5.15.2环境进行编写,大家可根据自身开发环境进行相应的修改,如有疑问可在评论区提出,如有不足之处请多包含,如觉得对您有所帮助麻烦点个赞^_^,谢谢!。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值