最近項(xiàng)目上有需求,需要對(duì)qtableview上的數(shù)據(jù)進(jìn)行多選及多行刪除。經(jīng)過(guò)多次嘗試,總結(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)前類(lèi)顯示復(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)每一行的選擇,并支持全選/反選的功能。
接下來(lái),來(lái)實(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ì)來(lái)說(shuō)比較容易,只要找到槽函數(shù)1所對(duì)應(yīng)的行數(shù)信息,由于該變量是全局變量,直接刪除就行了
多行刪除就比較麻煩了,要從最后一行往前刪,不然會(huì)出現(xiàn)刪錯(cuò)行的問(wèn)題。
四、總結(jié)
如上所示,即為tableview多行選中并進(jìn)行刪除代碼及說(shuō)明,具體后期實(shí)現(xiàn)結(jié)果如下:
-
數(shù)據(jù)
+關(guān)注
關(guān)注
8文章
7035瀏覽量
89047 -
按鍵
+關(guān)注
關(guān)注
4文章
223瀏覽量
57602 -
代碼
+關(guān)注
關(guān)注
30文章
4788瀏覽量
68628 -
checkbox
+關(guān)注
關(guān)注
0文章
3瀏覽量
1106
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論