VS2010+QT5编程之QTableView同时删除选中的多行

来源:互联网 发布:淘宝大韩泡泡糖是高仿 编辑:程序博客网 时间:2024/06/06 09:37

QTableView同时删除选中的多行,对于新手来说是一个容易出现错误的地方。

下面是一段错误的代码:

QModelIndexList indexList = tableview->selectionModel()->selectedIndexes();QModelIndex index;foreach(index,indexList){   view_model->removeRow(index.row()); }

错误现象:如果此tableview有多行多列,执行完后会发现删除的结果不同于我们预想。

错误分析:假设是一个五行四列的tableview,而你选中了第二和第四整行,你会发现indexList其实有八个元素(一个格子一个元素,而不是一行一个元素),执行removeRow操作实际上是重复删除某一行,而且第一次执行removeRow后view_model会发生变化,所以第一次执行后的再次执行都是错误的。


正确代码:

this->setSelectionBehavior(QAbstractItemView::SelectRows); //选择整行 //基于自写的派生于QTableView的TableView

void TableView::deleteItem(){    QModelIndexList indexList1 = this->selectionModel()->selectedIndexes();    while (!indexList1.isEmpty())    {        QModelIndexList indexList = deleteRepeatList(indexList1);        QModelIndex index = indexList.first();        model->removeRow(index.row());        indexList1 = this->selectionModel()->selectedIndexes();    }}

其中deleteRepeatList函数代码:

QModelIndexList TableView::deleteRepeatList(QModelIndexList indexList){    QModelIndex index,newIndex;    QModelIndexList newIndexList;    foreach(index,indexList)    {        if (newIndex.row() != index.row())        {            newIndex = index;            newIndexList.append(newIndex);        }    }    return newIndexList;}


0 0
原创粉丝点击