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

这篇具有很好参考价值的文章主要介绍了如何对qtableview上的数据进行多选及多行删除。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

tableview添加checkbox

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
    , model(new QStandardItemModel(this))
{
    QLoggingCategory::defaultCategory()->setEnabled(QtDebugMsg, true);
    ui->setupUi(this);
    ui->tableView->setModel(model);
    auto nRowCount = 10;
    auto nColCount = 3;
    ui->tableView->setShowGrid(false);




    for(auto nRowIndex = 0; nRowIndex < nRowCount; ++nRowIndex)
    {
        ExperiTemplateItem templateItem;
        QString qsText = QString("checkbox%1").arg(nRowIndex);
        templateItem.wgt = new QWidget;       
        templateItem.checkbox = new QCheckBox(templateItem.wgt);
        templateItem.hlayout = new QHBoxLayout;
        templateItem.checkbox->setStyleSheet(tr("QCheckBox::indicator{width:15px;height:15px;}"));
        templateItem.hlayout->addWidget(templateItem.checkbox);
        templateItem.hlayout->setAlignment(Qt::AlignCenter);
        templateItem.hlayout->setContentsMargins(0,0,0,0);
        templateItem.wgt->setLayout(templateItem.hlayout);
        templateItem.checkitem = new QStandardItem;
        model->setItem(nRowIndex, 0, templateItem.checkitem);
        auto modelIndex = model->index(nRowIndex, 0);
        ui->tableView->setIndexWidget(modelIndex, templateItem.wgt);




        qsText = QString("abcdefg1");
        templateItem.experimentTemplate = new QStandardItem(qsText);
        model->setItem(nRowIndex, 1, templateItem.experimentTemplate);
        templateItem.fromUser = new QStandardItem(qsText);
        model->setItem(nRowIndex, 2, templateItem.fromUser);
        ui->tableView->setRowHeight(nRowIndex, 50);
        list.push_back(templateItem);
    }
    ui->tableView->setSelectionBehavior(QAbstractItemView::SelectRows);
    ui->tableView->setAlternatingRowColors(true);
    ui->tableView->setStyleSheet("alternate-background-color:rgb(176,224,230);background-color:rgb(255,255,255)");
    ui->tableView->setEditTriggers(QAbstractItemView::NoEditTriggers);
    ui->tableView->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);
    ui->tableView->horizontalHeader()->setVisible(false);
    ui->tableView->verticalHeader()->setVisible(false);
    QScroller *pScroller = QScroller::scroller(ui->tableView);
    pScroller->grabGesture(ui->tableView,QScroller::LeftMouseButtonGesture);
    ui->tableView->setVerticalScrollMode(QAbstractItemView::ScrollPerPixel);
}

单行删除相对来说比较容易,多行删除就比较麻烦了,要从最后一行往前删,不然会出现删错行的问题。文章来源地址https://www.toymoban.com/news/detail-773541.html

void MainWindow::on_pushButton_clicked(bool checked)
{
    int count = 0;
    for(ExperiTemplateItem x : list)
    {
        if(x.checkbox->isChecked())
        {
            count++;
        }
    }


    while(count > 0)
    {
        QList<ExperiTemplateItem>::reverse_iterator rit;
        for(rit = list.rbegin(); rit != list.rend(); ++rit)
        {
            //找到标的行号  必须从最后一行  往前删除  不然会打乱顺序
            if(rit->checkbox->isChecked())
            {
                QModelIndex index = ui->tableView->indexAt(rit->wgt->pos());
                rit->wgt->close();
                delete rit->fromUser;
                delete rit->experimentTemplate;
                delete rit->checkitem;
                delete rit->hlayout;
                delete rit->checkbox;
                delete rit->wgt;
                model->removeRow(index.row());
                /*
                反向迭代器删除元素
                所有的 erase 函数都只接受正向迭代器 iterator,所以如果想在反向遍历删除元素时必须
                要将 reverse_iterator 转换为 iterator 后再执行 erase 操作,所以反向迭代器与正向
                迭代器相差 1 的这个细节在这里必须要考虑清楚。比如按上图 ri 指向元素 3,但转换为正
                向迭代器后实际为指向元素 4 的位置,为了能正确执行删除,必须先将反向迭代器前进 1 步
                再转为正向迭代器。

                */
                list.erase((++rit).base());//转为正向迭代器
                count--;
                break;
            }
        }
    }
    qDebug("rows:%d\n", list.size());
}

到了这里,关于如何对qtableview上的数据进行多选及多行删除的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • QT中如何在plainTextEdit多行文本框输出int型数据

    使用多行文本框不能直接显示int型数据,需显示int数据必须将其转化为QString格式。

    2024年02月07日
    浏览(31)
  • chatgpt赋能python:Python如何不换行输出多行数据

    Python是一种高级编程语言,被广泛应用于各种领域,例如Web应用程序、数据分析和科学计算等。在Python编程中,有时我们需要一次性输出多行数据,但默认情况下Python会自动在每行末尾添加换行符。本文将介绍Python如何不换行输出多行数据,并提供几种实现方法。 在Python中,

    2024年02月08日
    浏览(43)
  • el-table select 多选框如何实现选中数据回显

    现象描述: 将用户勾选的内容添加到表格,当页面还未关闭时,选项还是正常勾选,但是只要退出该页面,再进来就会发现勾选被取消了 需求描述: 已选择项默认勾选,且表格内容更改,勾选项也同步更改 效果如下:

    2024年02月14日
    浏览(44)
  • python 将excel 多行进行分组合并

    2024年02月14日
    浏览(41)
  • QTableView大数据文件显示(1000万行数据)

    参考: (2条消息) QTableWidget大数据文件显示(1000万行数据)_江南又旧雨的博客-CSDN博客 读取文件时间+表格插入数据时间   需要等待的比较久。 表格后期插入一行数据大概需要0.1ms,1000万行数据,大概得100s得时间。 参考下文博客中得动态加载: (2条消息) QTableWidget大数据文

    2024年02月07日
    浏览(37)
  • QSqlDatabase(2)实例,QTableView显示数据库表数据

    目录 前言 1、实现的功能 2、具体的代码实现 前言 想了解QSqlDatabase基本知识的,以及增删改查的用法,可以浏览上一篇文章: QSqlDatabase(1)基本接口,以及(增删改除)的简单实例_Ivy_belief的博客-CSDN博客 这篇主要实战,写了一个数据动态库。 1、实现的功能 先来看看要实现的

    2024年02月11日
    浏览(40)
  • Qt QTableView 实现数据改变表格自动刷新

    这里提供一份简单的代码示例,实现QTableView实时刷新数据: 在代码中,我们首先创建一个QStandardItemModel数据模型,并设置表格的行数和列数,同时设置表头和填充数据。然后将数据模型绑定到QTableView中,并实现数据变化自动刷新的功能。最后显示QWidget窗口。 在实际开发中

    2024年02月13日
    浏览(40)
  • vue的el-table多选对某个选项进行禁用

    文档相关链接 el-table多选官方文档 用法

    2024年02月04日
    浏览(47)
  • Qt 获得QTableview所选中的行的某一列数据

    1、点击QtableView控件-》右键-》跳到槽-》选择 2、编写槽函数信息  备注:由于信息保密,我把类名用XXX代替了

    2024年02月16日
    浏览(43)
  • 2306d创建可选及别名问题

    原文 如何通过 std.sumtype 创建 可选 类型? 我收到错误:未定义的 T标识 你打算输入: 不幸,因为 1807 问题,这不是定义 可选 类型的好方法.如果试按 函数参数 用它,则会收到 令人困惑 的错误消息. 要解决它,应使用带 alias this(别名本) 的结构定义 可选 类型,如D博客上的本文中所述

    2024年02月11日
    浏览(26)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包