QT QTableView 及 QSortFilterProxyModel 排序 过滤

QTableView实现排序有两种方法:

  1. 重写sort虚函数
  2. 使用QSortFilterProxyModel代理

下面介绍第2种方法:

MyModel *tableModel = new MyModel(ui->tableview);
QSortFilterProxyModel *proxyModel = new QSortFilterProxyModel(this);

proxyModel->setSourceModel(tableModel);
ui->tableview->setModel(proxyModel);

使用代理之后排序、筛选变得容易,但同样会带来一些问题。

  1. 在源模型model删除或增加时程序奔溃挂掉
  2. 在界面删除或增加时没有删除或增加目标位置index的数据
    第一个问题是在MyModel 中使用了layoutChanged()信号,发送该信号后model中模型视图映射关系并没有完全清除,故将该信号函数用reset()函数代替 ,( QT5中已经删除reset函数,可使用 AbstractItemModel::beginResetModel() QAbstractItemModel::endResetModel() ),在次编译运行程序,多次测试均不会奔溃,问题解决。https://blog.csdn.net/chenhongwei610/article/details/96912919

第二个问题是由于在排序筛选后从tableview取得的indexs是QSortFilterProxyModel 的,需要使用其函数 proxyModel->mapToSource(index)转化为MyModel 的index

你可能感兴趣的:(VS,c++,qt,排序)