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

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

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

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

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

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

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

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

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

一、tableview添加checkbox

此處參考了網(wǎng)上的資料,具體實(shí)現(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 全選/反選

全選,反選,本人綁定了一個(gè)按鍵實(shí)現(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);       //選中了 則不選中
        }
    }
}

如上代碼所示:

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

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

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

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

頭文件有如下定義:

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

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

源文件如下:

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

//必須先對(duì)tableview配置如下功能  本人tableview名字叫tableView_Measure
    ui->tableView_Measure->setSelectionBehavior(QAbstractItemView::SelectRows);
    ui->tableView_Measure->setContextMenuPolicy(Qt::CustomContextMenu);    

//菜單等事件
    RightClickMenu = new QMenu();               //右鍵點(diǎn)擊菜單
    deleteAction = new QAction("刪除",this);               //單行刪除事件
    deleteMultiAction = new QAction("多行刪除",this);       //多行刪除
    RightClickMenu->addAction(deleteAction);    //將action添加到菜單內(nèi)
    RightClickMenu->addAction(deleteMultiAction);

    //信號(hào)槽連接
    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() == "刪除")   //看選中了刪除這個(gè)菜單
    {
        //彈出提示框,看是否刪除數(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)的序號(hào)  必須從最后一行  往前刪除  不然會(huì)打亂順序
            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)了刪除單行和多行的功能

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

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

四、總結(jié)

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

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

    關(guān)注

    8

    文章

    6715

    瀏覽量

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

    關(guān)注

    4

    文章

    222

    瀏覽量

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

    關(guān)注

    30

    文章

    4671

    瀏覽量

    67767
  • checkbox
    +關(guān)注

    關(guān)注

    0

    文章

    3

    瀏覽量

    1079
收藏 人收藏

    評(píng)論

    相關(guān)推薦

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

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

    多選按鈕

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

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

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

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

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

    用CAD刪除選擇多選的實(shí)體怎么操作?

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

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

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

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

    數(shù)據(jù)隱私性,因此未實(shí)現(xiàn)真正意義的確定性刪除。針對(duì)上述問題,提出了一種基于密文采樣分片的方案,來實(shí)現(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ù)隱私的迷霧

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

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

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

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

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

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

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

    c++多行注釋快捷鍵

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

    python如何將多行合并成一行

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

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

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