最近项目上有需求,需要对qtableview上的数据进行多选及多行删除。经过多次尝试,总结出了如下方法。
先上最终实现的效果,如下

如上图所示,第一列为checkbox ,第二列为有效数据,可以用多列数据。
注:model_measure为本人绑定tableview所用的model,由于此项未做传参,用的默认的全局变量。
一、tableview添加checkbox
此处参考了网上的资料,具体实现如下:
//设置当前类显示复选框
void MainFrame::SetCurrentRowCheck(int row,bool checked)
{
QStandardItem *item = new QStandardItem();
item->setCheckable(true); //设置可选
if(! checked)
{
item->setCheckState(Qt::Unchecked);
}
else
{
item->setCheckState(Qt::Checked);
}
item->setEditable(false);
model_measure->setItem(row, 0, item); //在第一列用checkbox(0表示第一列,row表示行,可以自由修改)
model_measure->item(row, 0)->setTextAlignment(Qt::AlignHorizontal_Mask); //设置布局
}
如上代码所示,本人将第一列设置为复选框,默认调用此函数,每需要一行新的数据,则调用一次该函数,传入行数及是否选中参数,即可以在第一列,所有行生成checkbox
二、checkbox 全选/反选
全选,反选,本人绑定了一个按键实现,代码如下所示:
//全选/反选
void MainFrame::on_pushButton_Select_clicked()
{
for(int i = 0; irowCount(); i++)
{
if(Qt::Unchecked == model_measure->item(i,0)->checkState())
{
SetCurrentRowCheck(i,true); //未选中 则选中
}
else if(Qt::Checked == model_measure->item(i,0)->checkState())
{
SetCurrentRowCheck(i,false); //选中了 则不选中
}
}
}
如上代码所示:
点一次按键,则将未选中的都选中,选中的都置为未选中,反之亦然。
三、表格关联右键菜单及行删除
如上实现功能,可以实现每一行的选择,并支持全选/反选的功能。
接下来,来实现一下右键菜单关联
头文件有如下定义:
包括几个变量 和2个槽函数
private:
QMenu *RightClickMenu; //右键点击菜单
QAction *deleteAction; //单行删除事件(如需要其它事件,可新定义)
QAction *deleteMultiAction; //多行删除事件(如需要其它事件,可新定义)
int seletMouseRow; //选择到的表格的行数信息
public slots:
void onGetMousePos(QPoint pos); //菜单 点击 获取当前位置
void onMenuAction(QAction *act); //事件操作
源文件如下:
构造函数:
//必须先对tableview配置如下功能 本人tableview名字叫tableView_Measure
ui->tableView_Measure->setSelectionBehavior(QAbstractItemView::SelectRows);
ui->tableView_Measure->setContextMenuPolicy(Qt::CustomContextMenu);
//菜单等事件
RightClickMenu = new QMenu(); //右键点击菜单
deleteAction = new QAction("删除",this); //单行删除事件
deleteMultiAction = new QAction("多行删除",this); //多行删除
RightClickMenu->addAction(deleteAction); //将action添加到菜单内
RightClickMenu->addAction(deleteMultiAction);
//信号槽连接
connect(ui->tableView_Measure,&QTableView::customContextMenuRequested,this,&MainFrame::onGetMousePos);
connect(RightClickMenu,&QMenu::triggered,this,&MainFrame::onMenuAction);
槽函数1
//获取位置信息
void MainFrame::onGetMousePos(QPoint pos)
{
QModelIndex index = ui->tableView_Measure->indexAt(pos); //找到tableview当前位置信息
seletMouseRow = index.row(); //获取到了当前右键所选的行数
if(index.isValid()) //如果行数有效,则显示菜单
{
RightClickMenu->exec(QCursor::pos());
}
//qDebug() << "curr_row" << seletMouseRow;
}
槽函数2
//菜单操作
void MainFrame::onMenuAction(QAction *act)
{
//删除本行数据
if(act->text() == "删除") //看选中了删除这个菜单
{
//弹出提示框,看是否删除数据
QMessageBox message(QMessageBox::NoIcon, "提示",
"是否删除本行数据?",
QMessageBox::Yes | QMessageBox::No, NULL);
//如确认删除
if(message.exec() == QMessageBox::Yes)
{
model_measure->removeRow(seletMouseRow); //删除掉了表格信息
}
}
//删除多行数据
else if(act->text() == "多行删除")
{
//弹出提示框,看是否删除数据
QMessageBox message(QMessageBox::NoIcon, "提示",
"是否删除所有选中行的数据?",
QMessageBox::Yes | QMessageBox::No, NULL);
//如确认删除多行 则删除多行数据
if(message.exec() == QMessageBox::Yes)
{
QVector<int> row_list;
row_list.clear();
//找到标的序号 必须从最后一行 往前删除 不然会打乱顺序
for(int i = model_measure->rowCount() - 1; i >= 0 ; i--)
{
if(Qt::Checked == model_measure->item(i,0)->checkState()) //i行0列 复选框
{
row_list.push_back(i);
}
}
//根据填充到的数据 删除选中列
for(int j = 0; jremoveRow(row_list.at(j));
}
}
}
}
槽函数2 承担了删除单行和多行的功能
单行删除相对来说比较容易,只要找到槽函数1所对应的行数信息,由于该变量是全局变量,直接删除就行了
多行删除就比较麻烦了,要从最后一行往前删,不然会出现删错行的问题。
四、总结
如上所示,即为tableview多行选中并进行删除代码及说明,具体后期实现结果如下:

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。
举报投诉
-
数据
+关注
关注
8文章
7347浏览量
95004 -
按键
+关注
关注
4文章
229浏览量
58537 -
代码
+关注
关注
30文章
4975浏览量
74349 -
checkbox
+关注
关注
0文章
3浏览量
1231
发布评论请先 登录
相关推荐
热点推荐
怎么在导入DXF时进行多选和框选板框?
导入DXF时,进行禁止布线层,需要复制那个机械层里面的框,怎么进行选择外围框,我看视频太快,不知道按什么键进行多选的。因为框没有连起来!
发表于 06-04 04:06
用CAD删除选择多选的实体怎么操作?
在浩辰CAD绘图的过程中,我们经常需要对实体有删改,当对一个或者多个实体有多选的操作,难道要直接取消命令吗?其实不用,CAD删除功能可以帮助使用者解决这个问题。实际在这种情况下,并不需要取消命令重新
发表于 08-06 23:04
云端数据确定性删除方法
数据隐私性,因此未实现真正意义上的确定性删除。针对上述问题,提出了一种基于密文采样分片的方案,来实现云端数据的确定性删除。利用密文采样分片思
发表于 03-06 10:45
•0次下载
手机如何永久删除数据
为了保护隐私,在切换旧手机之前,需要完全清除手机数据。它一直是我们恢复出厂设置的最常用方法。恢复出厂设置的旧手机,其他人仍然可以恢复已删除的照片、数据。那么如何彻底删除旧手机上的
如何才能删除SQL数据局镜像
SQLSERVER删除数据库镜像 SQLServer删除数据库镜像,其实这之前有个很诡异的问题。..在数据库镜像断开后,如何从新建立镜像的连接呢?
发表于 09-26 17:51
•18次下载
NetApp存储误删除的数据恢复案例
故障:
管理员误操作删除NetApp存储上的所有lun。和管理员沟通后得知:因为业务变化,需要重新规划存储空间,管理员直接把存储卷全部删除并重新分配。在执行删除操作之后还没有来得及分
Redis的删除策略和内存淘汰机制介绍
执行之前都会调用 expireIfNeeded函数对其进行检查,如果过期,则删除该键,然后执行键不存在的操作;未过期则不作操作,继续执行原有的命令。 定期删除:由Redis.c/activeExpireCycle 函数实现,函数
c++多行注释快捷键
*/ 结束。在这两个标记之间的所有内容都会被视为注释,并且不会参与编译和执行。 为了添加或删除多行注释,你可以使用C++的集成开发环境(IDE)提供的快捷键。下面是一些常见的C++开发环境中常用的多行注释快捷键: Visual
python如何将多行合并成一行
在Python中,有多种方法可以将多行合并成一行。以下是详细解释和示例: 方法一:使用字符串的replace()方法 你可以使用字符串的replace()方法来删除换行符并将多行合并为一行。首先,你
服务器数据恢复—存储中卷被删除后重建如何恢复被删除卷的数据?
服务器存储数据恢复环境:
某品牌FlexStorage P5730服务器存储,存储中有一组由24块硬盘组建的RAID5阵列,包括1块热备硬盘。
服务器存储故障:
存储中的2个卷被删除,删除之后重建了一个新卷。需要恢复之
NetApp数据恢复—NetApp存储误删除的数据恢复案例
某公司一台NetApp存储,该存储中有24块磁盘。
工作人员误删除了NetApp存储中一个文件夹,文件夹中有非常重要的数据。
数据恢复工程师在现场对该存储进行了初检。虽然这个文件夹
如何对qtableview上的数据进行多选及多行删除
评论