QTableView的数据模型使用继承于QAbstractTableModel的自定义类,数据通过QList保存,过滤和排序使用继承于QSortFilterProxyModel的自定义类,当我在调用排序或过滤的时候,继承于QAbstractTableModel的自定义类中的链表QList并不会变化,导致我想找对应行数据不对应,有什么好的方法解决吗,在过滤或排序的同时去修改链表中 的数据,使用c++ qt
时间: 2023-12-14 09:38:29 浏览: 61
Python+PyQt5+Mysql通过QSqlQueryModel实现的QTableView分页显示,表头排序等功能
5星 · 资源好评率100%
在使用QSortFilterProxyModel时,QAbstractTableModel中的数据模型不会发生变化,因为QSortFilterProxyModel是在QAbstractTableModel的基础之上进行过滤和排序的。因此,如果您想要修改QAbstractTableModel中的数据,您需要在QSortFilterProxyModel中实现setData()函数并在该函数中修改QAbstractTableModel中的数据。
您可以按照以下步骤实现:
1. 在QAbstractTableModel中添加一个函数来更新模型中的数据,例如updateData()。
2. 在QSortFilterProxyModel中重写setData()函数,并在该函数中调用QAbstractTableModel中的updateData()函数。
例如:
```c++
void MySortFilterProxyModel::setData(const QModelIndex& index, const QVariant& value, int role)
{
if (role == Qt::EditRole) {
QAbstractTableModel* sourceModel = dynamic_cast<QAbstractTableModel*>(sourceModel());
if (sourceModel) {
// 修改QAbstractTableModel中的数据
sourceModel->updateData(index.row(), index.column(), value);
}
}
QSortFilterProxyModel::setData(index, value, role);
}
```
3. 在QAbstractTableModel的updateData()函数中更新链表中的数据。
例如:
```c++
void MyTableModel::updateData(int row, int column, const QVariant& value)
{
if (row >= 0 && row < m_dataList.count() && column >= 0 && column < MyTableModel_ColumnCount) {
// 更新链表中的数据
m_dataList[row][column] = value;
// 发送数据变化信号,更新视图
QModelIndex topLeft = createIndex(row, column);
QModelIndex bottomRight = createIndex(row, column);
emit dataChanged(topLeft, bottomRight);
}
}
```
这样,在进行过滤或排序时,QAbstractTableModel中的数据将会被正确地更新,从而保证数据的一致性。
阅读全文