最近項目上有需求,需要對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é)果如下:
-
數(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
發(fā)布評論請先 登錄
相關(guān)推薦
評論