• Qt QtableWidget、QtableView表格删除选中行、删除单行、删除多行


    Qt QtableWidget表格删除选中行

    只能选择一行,点击按钮后,删除一行

    设置

    	QTableWidget *tb = ui->tableWidget;
        tb->setSelectionBehavior(QAbstractItemView::SelectRows);
        tb->setSelectionMode(QAbstractItemView::SingleSelection);
    
    • 1
    • 2
    • 3

    操作

        QTableWidget *tb = ui->tableWidget;
        int curRow=tb->currentRow();     //当前行号
        tb->removeRow(curRow);           //删除当前行及其items
    
    • 1
    • 2
    • 3

    可以选择中多行,点击按钮后,删除多行

    设置

        QTableWidget *tb = ui->tableWidget;
        tb->setSelectionBehavior(QAbstractItemView::SelectRows);
        tb->setSelectionMode(QAbstractItemView::ExtendedSelection);
    
    • 1
    • 2
    • 3

    操作

    	QTableWidget *tb = ui->tableWidget;
        QItemSelectionModel  *m_selection = tb->selectionModel();
        QModelIndexList indexList = m_selection->selectedIndexes();
        QList<int> list;
        int prev =-1,curr=-1;
        if(indexList.length()>1){
    		//预处理第一行
            prev  = indexList.at(0).row();
            list.append(prev);
    
            for(int i=1;i<indexList.length();i++){
                //qDebug() <<"row: "<< indexList.at(i).row() <<"column: "<
                curr = indexList.at(i).row();
                if(prev ==curr){
                    continue;
                }else{
                    prev = curr;
                    list.append(prev);
                }
            }
        }else if(indexList.length()==1){
            list.append(indexList.at(0).row());
        }else{
            return;
        }
        //从大到小排序,必须从最后一行  往前删除  不然会打乱顺序
        std::sort(list.rbegin(),list.rend());
        //根据填充到的数据 删除选中列
        for(int j = 0; j <list.size(); j++)
        {
            int cc = list.at(j);
            tb->removeRow(cc);           //删除当前行及其items
        }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33

    选中某一列中的不同行,点击按钮后,删除多行

    无需设置setSelectionBehavior(QAbstractItemView::SelectRows),但是可以选择的那一列最好设置为不可编辑。按下Ctrl键,选择多行。

    设置1

        tableView->setSelectionMode(QAbstractItemView::ExtendedSelection);//选择模式
        m_selection = new QItemSelectionModel(m_model,this);           //创建选择模型
        tableView->setSelectionModel(m_selection); //设置选择模型
    
    • 1
    • 2
    • 3

    设置2

            QStandardItem *item1 = new QStandardItem("aa1");
            item1->setEditable(false);
            QStandardItem *item2 = new QStandardItem("aa2");
            item2->setEditable(false);        
            QList<QStandardItem *> list = {item1,item2};
    		model->appendRow(list);        
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    操作

                QModelIndexList indexList = m_selection->selectedIndexes();
                QList<int> list;
                int sameColumn=-1;
                for(int i=0;i<indexList.length();i++){
                    if(i==0){sameColumn=indexList.at(i).column();}
                    //qDebug() <<"row: "<< indexList.at(i).row() <<"column: "<
                    if(sameColumn!=indexList.at(i).column()){
                        //上面currentColumnChanged信号其实已经让用户只能选择同一列,这里双重保险
                        qDebug()<<"你的选择有不同列,请务必选择同一列的不同行来进行多行删除操作";
                        return;
                    }
                    list.append(indexList.at(i).row());
                }
                //从大到小排序,必须从最后一行  往前删除  不然会打乱顺序
                std::sort(list.rbegin(),list.rend());
                //根据填充到的数据 删除选中列
                for(int j = 0; j <list.size(); j++)
                {
                    int cc = list.at(j);
                    m_model->removeRow(cc);
                }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21

    QTableWidgetSelectionRange介绍

    QTableWidgetSelectionRange是Qt框架中用于表示QTableWidget中选定的一块单元格区域的类。以下是如何使用QTableWidgetSelectionRange的一些常见操作:

    1. 获取当前选定的单元格区域:
    QList<QTableWidgetSelectionRange> ranges = tableWidget->selectedRanges();
    
    • 1
    1. 获取第一个选定的单元格区域的起始行、起始列、行数和列数:
    if (!ranges.isEmpty()) {
        int startRow = ranges.first().topRow();
        int startColumn = ranges.first().leftColumn();
        int rowCount = ranges.first().rowCount();
        int columnCount = ranges.first().columnCount();
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    1. 遍历所有选定的单元格区域:
    foreach (const QTableWidgetSelectionRange &range, ranges) {
        int startRow = range.topRow();
        int startColumn = range.leftColumn();
        int rowCount = range.rowCount();
        int columnCount = range.columnCount();
        // 进行处理...
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    1. 检查特定的单元格区域是否被选定:
    QTableWidgetSelectionRange range(1, 1, 3, 3); // 定义一个起始行为1,起始列为1,行数和列数为3的区域
    if (tableWidget->selectedRanges().contains(range)) {
        // 区域被选定
    }
    
    • 1
    • 2
    • 3
    • 4
    1. 清除所有选定的单元格区域:
    tableWidget->clearSelection();
    
    • 1

    QTableWidgetSelectionRange类提供了一种方便的方式来处理QTableWidget中的选择区域。使用它可以获取和操作选定的单元格区域,进行相关的处理和操作。

    QTableWidget的选择模式

    QTableWidget通过setSelectionMode()SelectionBehavior来设置选择模式

    enum QAbstractItemView::SelectionBehavior

    ConstantValueDescription
    QAbstractItemView::SelectItems0Selecting single items.
    QAbstractItemView::SelectRows1Selecting only rows.
    QAbstractItemView::SelectColumns2Selecting only columns.

    enum QAbstractItemView::SelectionMode

    此枚举指示视图如何响应用户选择:

    ConstantValueDescription
    QAbstractItemView::SingleSelection1When the user selects an item, any already-selected item becomes unselected. It is possible for the user to deselect the selected item by pressing the Ctrl key when clicking the selected item.
    QAbstractItemView::ContiguousSelection4When the user selects an item in the usual way, the selection is cleared and the new item selected. However, if the user presses the Shift key while clicking on an item, all items between the current item and the clicked item are selected or unselected, depending on the state of the clicked item.
    QAbstractItemView::ExtendedSelection3When the user selects an item in the usual way, the selection is cleared and the new item selected. However, if the user presses the Ctrl key when clicking on an item, the clicked item gets toggled and all other items are left untouched. If the user presses the Shift key while clicking on an item, all items between the current item and the clicked item are selected or unselected, depending on the state of the clicked item. Multiple items can be selected by dragging the mouse over them.
    QAbstractItemView::MultiSelection2When the user selects an item in the usual way, the selection status of that item is toggled and the other items are left alone. Multiple items can be toggled by dragging the mouse over them.
    QAbstractItemView::NoSelection0Items cannot be selected.
  • 相关阅读:
    Vue后台管理系统项目(33)完成SpuForm照片墙数据的收集
    山西电力市场日前价格预测【2023-10-24】
    Java 开发常用的 Linux 命令知识积累
    一文能读懂车载与Android的关系
    html:lang属性设置为中文zh-CN
    STM32F4 磁链观测器+PLL 无感无刷电机位置驱动
    PAT Head of a Gang(字符串转化成数字,图的dfs)
    福岛邦彦在多少年创立了卷积神经网络
    【 第十四章 网络编程要素(IP和端口,网络通信协议),实现TCP的网络编程】
    【附论文、源码】基于微信小程序的同学录管理系统 毕业设计198333
  • 原文地址:https://blog.csdn.net/e891377/article/details/132689343