0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

如何对qtableview上的数据进行多选及多行删除

CHANBAEK 来源:嵌入式MCU客栈 作者:xiaoxiangyu 2023-01-17 14:40 次阅读

最近项目上有需求,需要对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

    文章

    7015

    浏览量

    88996
  • 按键
    +关注

    关注

    4

    文章

    223

    浏览量

    57598
  • 代码
    +关注

    关注

    30

    文章

    4786

    浏览量

    68565
  • checkbox
    +关注

    关注

    0

    文章

    3

    浏览量

    1094
收藏 人收藏

    评论

    相关推荐

    图片的DeviceOpen点击后怎么出现这么多选项,怎么创建

    那个图片的DeviceOpen点击后怎么出现这么多选项,这是怎么创建的?急切的需要解答
    发表于 11-23 21:48

    多选按钮

    请问各位大神有没有多选按钮啊,如果没有的话,做一个用怎么样的思路可以实现?
    发表于 11-18 14:00

    请教,LabVIEW表格鼠标下拉多选右键删除怎么做?

    最近看到老外的一个视频,表格鼠标下拉多选后,右键点击删除菜单,不知道如何得到的?请教各位。
    发表于 12-23 10:30

    怎么在导入DXF时进行多选和框选板框?

    导入DXF时,进行禁止布线层,需要复制那个机械层里面的框,怎么进行选择外围框,我看视频太快,不知道按什么键进行多选的。因为框没有连起来!
    发表于 06-04 04:06

    用CAD删除选择多选的实体怎么操作?

    在浩辰CAD绘图的过程中,我们经常需要对实体有删改,当对一个或者多个实体有多选的操作,难道要直接取消命令吗?其实不用,CAD删除功能可以帮助使用者解决这个问题。实际在这种情况下,并不需要取消命令重新
    发表于 08-06 23:04

    多行发送的相关资料分享

    C# 学习笔记(14)自己的串口助手----多行发送在上一篇串口助手的基础实现多行发送功能。多行发送使用了DataGridView控件实现,打算是可以自由添加行数,但是有一个
    发表于 02-23 07:42

    云端数据确定性删除方法

    数据隐私性,因此未实现真正意义的确定性删除。针对上述问题,提出了一种基于密文采样分片的方案,来实现云端数据的确定性删除。利用密文采样分片思
    发表于 03-06 10:45 0次下载

    手机如何永久删除数据

    为了保护隐私,在切换旧手机之前,需要完全清除手机数据。它一直是我们恢复出厂设置的最常用方法。恢复出厂设置的旧手机,其他人仍然可以恢复已删除的照片、数据。那么如何彻底删除旧手机上的
    的头像 发表于 03-01 14:53 2.9w次阅读

    微软删除知名数据集 拨开数据隐私的迷雾

    微软在日前删除了一个名人图片数据集。这个本为世界最大的公开人脸识别数据集,现在已经不能通过微软的渠道访问。
    的头像 发表于 06-26 17:25 3601次阅读

    如何才能删除SQL数据局镜像

    SQLSERVER删除数据库镜像 SQLServer删除数据库镜像,其实这之前有个很诡异的问题。..在数据库镜像断开后,如何从新建立镜像的连接呢?
    发表于 09-26 17:51 18次下载

    数据库插入查询删除操作教程

    数据库插入查询删除操作教程
    发表于 12-07 09:57 2次下载

    NetApp存储误删除数据恢复案例

    故障: 管理员误操作删除NetApp存储的所有lun。和管理员沟通后得知:因为业务变化,需要重新规划存储空间,管理员直接把存储卷全部删除并重新分配。在执行删除操作之后还没有来得及分
    的头像 发表于 02-15 14:46 646次阅读
    NetApp存储误<b class='flag-5'>删除</b>的<b class='flag-5'>数据</b>恢复案例

    c++多行注释快捷键

    */ 结束。在这两个标记之间的所有内容都会被视为注释,并且不会参与编译和执行。 为了添加或删除多行注释,你可以使用C++的集成开发环境(IDE)提供的快捷键。下面是一些常见的C++开发环境中常用的多行注释快捷键: Visual
    的头像 发表于 11-22 10:24 8447次阅读

    python如何将多行合并成一行

    在Python中,有多种方法可以将多行合并成一行。以下是详细解释和示例: 方法一:使用字符串的replace()方法 你可以使用字符串的replace()方法来删除换行符并将多行合并为一行。首先,你
    的头像 发表于 11-24 09:42 4615次阅读

    NetApp数据恢复—NetApp存储误删除数据恢复案例

    某公司一台NetApp存储,该存储中有24块磁盘。 工作人员误删除了NetApp存储中一个文件夹,文件夹中有非常重要的数据数据恢复工程师在现场对该存储进行了初检。虽然这个文件夹
    的头像 发表于 08-12 13:35 269次阅读
    NetApp<b class='flag-5'>数据</b>恢复—NetApp存储误<b class='flag-5'>删除</b>的<b class='flag-5'>数据</b>恢复案例