精品国产人成在线_亚洲高清无码在线观看_国产在线视频国产永久2021_国产AV综合第一页一个的一区免费影院黑人_最近中文字幕MV高清在线视频

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

    文章

    6713

    瀏覽量

    88300
  • 按鍵
    +關注

    關注

    4

    文章

    222

    瀏覽量

    57490
  • 代碼
    +關注

    關注

    30

    文章

    4670

    瀏覽量

    67760
  • checkbox
    +關注

    關注

    0

    文章

    3

    瀏覽量

    1079
收藏 人收藏

    評論

    相關推薦

    圖片的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次下載

    手機如何永久刪除數據

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

    微軟刪除知名數據集 撥開數據隱私的迷霧

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

    如何才能刪除SQL數據局鏡像

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

    數據庫插入查詢刪除操作教程

    數據庫插入查詢刪除操作教程
    發表于 12-07 09:57 ?2次下載

    NetApp存儲誤刪除數據恢復案例

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

    c++多行注釋快捷鍵

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

    python如何將多行合并成一行

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

    NetApp數據恢復—NetApp存儲誤刪除數據恢復案例

    某公司一臺NetApp存儲,該存儲中有24塊磁盤。 工作人員誤刪除了NetApp存儲中一個文件夾,文件夾中有非常重要的數據。 數據恢復工程師在現場對該存儲進行了初檢。雖然這個文件夾
    的頭像 發表于 08-12 13:35 ?133次閱讀
    NetApp<b class='flag-5'>數據</b>恢復—NetApp存儲誤<b class='flag-5'>刪除</b>的<b class='flag-5'>數據</b>恢復案例