RM新时代网站-首页

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何對qtableview上的數(shù)據(jù)進(jìn)行多選及多行刪除

CHANBAEK ? 來源:嵌入式MCU客棧 ? 作者:xiaoxiangyu ? 2023-01-17 14:40 ? 次閱讀

最近項目上有需求,需要對qtableview上的數(shù)據(jù)進(jìn)行多選及多行刪除。經(jīng)過多次嘗試,總結(jié)出了如下方法。

先上最終實現(xiàn)的效果,如下

如上圖所示,第一列為checkbox ,第二列為有效數(shù)據(jù),可以用多列數(shù)據(jù)。

注:model_measure為本人綁定tableview所用的model,由于此項未做傳參,用的默認(rèn)的全局變量。

一、tableview添加checkbox

此處參考了網(wǎng)上的資料,具體實現(xiàn)如下:

//設(shè)置當(dāng)前類顯示復(fù)選框
void MainFrame::SetCurrentRowCheck(int row,bool checked)
{
    QStandardItem *item = new QStandardItem();
    item->setCheckable(true);        //設(shè)置可選 
    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);  //設(shè)置布局 
}

如上代碼所示,本人將第一列設(shè)置為復(fù)選框,默認(rèn)調(diào)用此函數(shù),每需要一行新的數(shù)據(jù),則調(diào)用一次該函數(shù),傳入行數(shù)及是否選中參數(shù),即可以在第一列,所有行生成checkbox

二、checkbox 全選/反選

全選,反選,本人綁定了一個按鍵實現(xiàn),代碼如下所示:

//全選/反選  
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);       //選中了 則不選中
        }
    }
}

如上代碼所示:

點一次按鍵,則將未選中的都選中,選中的都置為未選中,反之亦然。

三、表格關(guān)聯(lián)右鍵菜單及行刪除

如上實現(xiàn)功能,可以實現(xiàn)每一行的選擇,并支持全選/反選的功能。

接下來,來實現(xiàn)一下右鍵菜單關(guān)聯(lián)

頭文件有如下定義:

包括幾個變量 和2個槽函數(shù)

private:   
    QMenu *RightClickMenu;                          //右鍵點擊菜單
    QAction *deleteAction;                          //單行刪除事件(如需要其它事件,可新定義)
    QAction *deleteMultiAction;                     //多行刪除事件(如需要其它事件,可新定義)
    int     seletMouseRow;                          //選擇到的表格的行數(shù)信息
public slots:
    void onGetMousePos(QPoint pos);               //菜單 點擊   獲取當(dāng)前位置
    void onMenuAction(QAction *act);              //事件操作

源文件如下:

構(gòu)造函數(shù):

//必須先對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添加到菜單內(nèi)
    RightClickMenu->addAction(deleteMultiAction);

    //信號槽連接
    connect(ui->tableView_Measure,&QTableView::customContextMenuRequested,this,&MainFrame::onGetMousePos);
    connect(RightClickMenu,&QMenu::triggered,this,&MainFrame::onMenuAction);

槽函數(shù)1

//獲取位置信息
void MainFrame::onGetMousePos(QPoint pos)
{
    QModelIndex index = ui->tableView_Measure->indexAt(pos);    //找到tableview當(dāng)前位置信息
    seletMouseRow = index.row();    //獲取到了當(dāng)前右鍵所選的行數(shù)

    if(index.isValid())        //如果行數(shù)有效,則顯示菜單
    {
        RightClickMenu->exec(QCursor::pos());
    }

    //qDebug() << "curr_row" << seletMouseRow;
}

槽函數(shù)2

//菜單操作
void MainFrame::onMenuAction(QAction *act)
{
    //刪除本行數(shù)據(jù)
    if(act->text() == "刪除")   //看選中了刪除這個菜單
    {
        //彈出提示框,看是否刪除數(shù)據(jù)
        QMessageBox message(QMessageBox::NoIcon, "提示",
                                   "是否刪除本行數(shù)據(jù)?",
        QMessageBox::Yes | QMessageBox::No, NULL);

        //如確認(rèn)刪除
        if(message.exec() == QMessageBox::Yes)
        {
            model_measure->removeRow(seletMouseRow);  //刪除掉了表格信息
        }
    }
    //刪除多行數(shù)據(jù)
    else if(act->text() == "多行刪除")
    {
        //彈出提示框,看是否刪除數(shù)據(jù)
        QMessageBox message(QMessageBox::NoIcon, "提示",
                                   "是否刪除所有選中行的數(shù)據(jù)?",
        QMessageBox::Yes | QMessageBox::No, NULL);

        //如確認(rèn)刪除多行  則刪除多行數(shù)據(jù)
        if(message.exec() == QMessageBox::Yes)
        {
            QVector<int> row_list;
            row_list.clear();
            //找到標(biāo)的序號  必須從最后一行  往前刪除  不然會打亂順序
            for(int i = model_measure->rowCount() - 1; i >= 0 ; i--)
            {
                if(Qt::Checked == model_measure->item(i,0)->checkState())        //i行0列  復(fù)選框
                {
                    row_list.push_back(i);
                }
            }
            //根據(jù)填充到的數(shù)據(jù) 刪除選中列
            for(int j = 0; jremoveRow(row_list.at(j));
            }
        }
    }
}

槽函數(shù)2 承擔(dān)了刪除單行和多行的功能

單行刪除相對來說比較容易,只要找到槽函數(shù)1所對應(yīng)的行數(shù)信息,由于該變量是全局變量,直接刪除就行了

多行刪除就比較麻煩了,要從最后一行往前刪,不然會出現(xiàn)刪錯行的問題。

四、總結(jié)

如上所示,即為tableview多行選中并進(jìn)行刪除代碼及說明,具體后期實現(xiàn)結(jié)果如下:

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7002

    瀏覽量

    88938
  • 按鍵
    +關(guān)注

    關(guān)注

    4

    文章

    223

    瀏覽量

    57595
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4779

    瀏覽量

    68521
  • checkbox
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    1091
收藏 人收藏

    評論

    相關(guān)推薦

    圖片的DeviceOpen點擊后怎么出現(xiàn)這么多選項,怎么創(chuàng)建

    那個圖片的DeviceOpen點擊后怎么出現(xiàn)這么多選項,這是怎么創(chuàng)建的?急切的需要解答
    發(fā)表于 11-23 21:48

    多選按鈕

    請問各位大神有沒有多選按鈕啊,如果沒有的話,做一個用怎么樣的思路可以實現(xiàn)?
    發(fā)表于 11-18 14:00

    請教,LabVIEW表格鼠標(biāo)下拉多選右鍵刪除怎么做?

    最近看到老外的一個視頻,表格鼠標(biāo)下拉多選后,右鍵點擊刪除菜單,不知道如何得到的?請教各位。
    發(fā)表于 12-23 10:30

    怎么在導(dǎo)入DXF時進(jìn)行多選和框選板框?

    導(dǎo)入DXF時,進(jìn)行禁止布線層,需要復(fù)制那個機(jī)械層里面的框,怎么進(jìn)行選擇外圍框,我看視頻太快,不知道按什么鍵進(jìn)行多選的。因為框沒有連起來!
    發(fā)表于 06-04 04:06

    用CAD刪除選擇多選的實體怎么操作?

    在浩辰CAD繪圖的過程中,我們經(jīng)常需要對實體有刪改,當(dāng)對一個或者多個實體有多選的操作,難道要直接取消命令嗎?其實不用,CAD刪除功能可以幫助使用者解決這個問題。實際在這種情況下,并不需要取消命令重新
    發(fā)表于 08-06 23:04

    多行發(fā)送的相關(guān)資料分享

    C# 學(xué)習(xí)筆記(14)自己的串口助手----多行發(fā)送在上一篇串口助手的基礎(chǔ)實現(xiàn)多行發(fā)送功能。多行發(fā)送使用了DataGridView控件實現(xiàn),打算是可以自由添加行數(shù),但是有一個
    發(fā)表于 02-23 07:42

    云端數(shù)據(jù)確定性刪除方法

    數(shù)據(jù)隱私性,因此未實現(xiàn)真正意義的確定性刪除。針對上述問題,提出了一種基于密文采樣分片的方案,來實現(xiàn)云端數(shù)據(jù)的確定性刪除。利用密文采樣分片思
    發(fā)表于 03-06 10:45 ?0次下載

    手機(jī)如何永久刪除數(shù)據(jù)

    為了保護(hù)隱私,在切換舊手機(jī)之前,需要完全清除手機(jī)數(shù)據(jù)。它一直是我們恢復(fù)出廠設(shè)置的最常用方法?;謴?fù)出廠設(shè)置的舊手機(jī),其他人仍然可以恢復(fù)已刪除的照片、數(shù)據(jù)。那么如何徹底刪除舊手機(jī)上的
    的頭像 發(fā)表于 03-01 14:53 ?2.9w次閱讀

    微軟刪除知名數(shù)據(jù)集 撥開數(shù)據(jù)隱私的迷霧

    微軟在日前刪除了一個名人圖片數(shù)據(jù)集。這個本為世界最大的公開人臉識別數(shù)據(jù)集,現(xiàn)在已經(jīng)不能通過微軟的渠道訪問。
    的頭像 發(fā)表于 06-26 17:25 ?3591次閱讀

    如何才能刪除SQL數(shù)據(jù)局鏡像

    SQLSERVER刪除數(shù)據(jù)庫鏡像 SQLServer刪除數(shù)據(jù)庫鏡像,其實這之前有個很詭異的問題。..在數(shù)據(jù)庫鏡像斷開后,如何從新建立鏡像的連接呢?
    發(fā)表于 09-26 17:51 ?18次下載

    數(shù)據(jù)庫插入查詢刪除操作教程

    數(shù)據(jù)庫插入查詢刪除操作教程
    發(fā)表于 12-07 09:57 ?2次下載

    NetApp存儲誤刪除數(shù)據(jù)恢復(fù)案例

    故障: 管理員誤操作刪除NetApp存儲的所有l(wèi)un。和管理員溝通后得知:因為業(yè)務(wù)變化,需要重新規(guī)劃存儲空間,管理員直接把存儲卷全部刪除并重新分配。在執(zhí)行刪除操作之后還沒有來得及分
    的頭像 發(fā)表于 02-15 14:46 ?641次閱讀
    NetApp存儲誤<b class='flag-5'>刪除</b>的<b class='flag-5'>數(shù)據(jù)</b>恢復(fù)案例

    c++多行注釋快捷鍵

    */ 結(jié)束。在這兩個標(biāo)記之間的所有內(nèi)容都會被視為注釋,并且不會參與編譯和執(zhí)行。 為了添加或刪除多行注釋,你可以使用C++的集成開發(fā)環(huán)境(IDE)提供的快捷鍵。下面是一些常見的C++開發(fā)環(huán)境中常用的多行注釋快捷鍵: Visual
    的頭像 發(fā)表于 11-22 10:24 ?8412次閱讀

    python如何將多行合并成一行

    在Python中,有多種方法可以將多行合并成一行。以下是詳細(xì)解釋和示例: 方法一:使用字符串的replace()方法 你可以使用字符串的replace()方法來刪除換行符并將多行合并為一行。首先,你
    的頭像 發(fā)表于 11-24 09:42 ?4598次閱讀

    NetApp數(shù)據(jù)恢復(fù)—NetApp存儲誤刪除數(shù)據(jù)恢復(fù)案例

    某公司一臺NetApp存儲,該存儲中有24塊磁盤。 工作人員誤刪除了NetApp存儲中一個文件夾,文件夾中有非常重要的數(shù)據(jù)。 數(shù)據(jù)恢復(fù)工程師在現(xiàn)場對該存儲進(jìn)行了初檢。雖然這個文件夾
    的頭像 發(fā)表于 08-12 13:35 ?257次閱讀
    NetApp<b class='flag-5'>數(shù)據(jù)</b>恢復(fù)—NetApp存儲誤<b class='flag-5'>刪除</b>的<b class='flag-5'>數(shù)據(jù)</b>恢復(fù)案例
    RM新时代网站-首页