色哟哟视频在线观看-色哟哟视频在线-色哟哟欧美15最新在线-色哟哟免费在线观看-国产l精品国产亚洲区在线观看-国产l精品国产亚洲区久久

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

    文章

    7002

    瀏覽量

    88943
  • 按鍵
    +關注

    關注

    4

    文章

    223

    瀏覽量

    57595
  • 代碼
    +關注

    關注

    30

    文章

    4779

    瀏覽量

    68524
  • checkbox
    +關注

    關注

    0

    文章

    3

    瀏覽量

    1091
收藏 人收藏

    評論

    相關推薦

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

    手機如何永久刪除數據

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

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

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

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

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

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

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

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

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

    c++多行注釋快捷鍵

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

    python如何將多行合并成一行

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

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

    某公司一臺NetApp存儲,該存儲中有24塊磁盤。 工作人員誤刪除了NetApp存儲中一個文件夾,文件夾中有非常重要的數據數據恢復工程師在現場對該存儲進行了初檢。雖然這個文件夾
    的頭像 發表于 08-12 13:35 ?259次閱讀
    NetApp<b class='flag-5'>數據</b>恢復—NetApp存儲誤<b class='flag-5'>刪除</b>的<b class='flag-5'>數據</b>恢復案例
    主站蜘蛛池模板: 国产AV无码熟妇人妻麻豆| 两个人在线观看的视频720| 欧美精品高潮呻吟AV久久 | 久久久久久九九| 十分钟免费观看高清视频大全| 伊人综合在线22| 国产精品久久久久久久久久影院| 麻豆久久国产亚洲精品超碰热| 亚洲精品国产A久久久久久| 白丝萝莉喷水| 免费人成在线观看网站视频| 亚洲欧美日韩中字视频三区| 国产成人无码视频一区二区三区 | 日本熟妇乱妇熟色A片蜜桃| 最近中文字幕免费高清MV视频6| 国产色精品久久人妻无码看片软件 | 狠狠色狠狠色综合曰曰| 色老99九久精品偷偷鲁| 9LPORM原创自拍达人| 久久国产香蕉| 亚洲午夜久久久久中文字幕| 国产精品日本无码久久一老A| 日本邪恶全彩工囗囗番海贼王| 99久久久无码国产AAA精品| 久久精品天天爽夜夜爽| 亚洲日韩欧美国产专区| 国产精品人妻午夜福利| 体育生爆操| 国产成人久久精品激情| 日本久久久久久久做爰片日本| 99久久婷婷国产麻豆精品电影 | 5g天天影院天天看天天爽| 久久99热狠狠色一区二区| 亚洲国产在线精品第二剧情不卡| 国产精品福利电影| 天津相声广播在线收听| 动漫女主被扒开双腿羞辱| 人妻无码AV中文系统久久免费| G0GO人体大尺香蕉| 欧美人与善交大片| tube69hdxxxx日本|