如何在QT中为自定义模型实现removeRow()函数
How to implement removeRow() function for customized model in QT?
我搜索了QT文档以供参考,但我遇到了一些问题。以下是QT文档中的实现:
bool TableModel::removeRows(int position, int rows, const QModelIndex &index)
{
Q_UNUSED(index);
beginRemoveRows(QModelIndex(), position, position + rows - 1);
for (int row = 0; row < rows; ++row) {
listOfPairs.removeAt(position);
}
endRemoveRows();
return true;
}
我认为它使用表视图中的index.row来直接定位模型中的数据。但是,如果我为表视图启用排序,该怎么办?排序后,表视图中的索引与模型中的数据不对应。表视图中的第一行可以是模型中的第三数据。
如何通过表视图定位模型中的数据?removeRow()函数还有更好的实现吗?
您可以使用tableWidgetItem->setData(0,Qt::UserRole,"Desired Identity");即使对行进行排序,它也将始终是唯一的。参考QTableWidget通过用户数据查找一行
正如官方文件所说,
在模型/视图体系结构中,有两种方法可以进行排序:如果您的模型是可排序的,即如果它重新实现QAbstractItemModel::sort()函数,QTableView和QTreeView都提供了一个API,允许您以编程方式对模型数据进行排序。如果您的模型没有所需的接口,或者您想使用列表视图来显示数据,则另一种方法是在视图中显示数据之前,使用代理模型来转换模型的结构
因此,更改排序时会发生什么取决于如何为模型安排排序:视图中的排序会更改模型中的行排列,或者只更改代理模型的行排列。
如果使用代理模型,可以在代理模型的行(视图在当前排序中看到这些行)和原始模型的行之间插入一些映射。或者,您可以在原始模型中的行和该行的实际数据项之间添加一些映射——事实上,您甚至可以在模型的QAbstractItemModel::createIndex的重新实现中,将void*
直接嵌入到数据项的QModelIndex
中,然后从传递给removeRow
等方法的索引中检索指向该项的指针。另一种可能性是使用项的某个唯一整数标识符而不是指向它的直接指针进行操作。因此,如何选择行和实际模型项之间的映射方式取决于您。
- 如果没有malloc,链表实现将失败
- 如何在c++中实现处理器调度模拟器
- 如何在c++中使用引用实现类似python的行为
- 实现无开销push_back的最佳方法是什么
- 使用简单类型列表实现的指数编译时间.为什么
- 如何在BST的这个简单递归实现中消除警告
- 实现一个在集合上迭代的模板函数
- 我应该实现右值推送功能吗?我应该使用std::move吗
- 如何正确实现和访问运算符的各种自定义枚举器
- C++Union/Struct位域的实现和可移植性
- 这个极客对极客的trie实现是否存在内存泄漏问题
- 在c++中实现LinkedList时,应出现未处理的错误
- 为左值和右值的包装器实现C++范围
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 使用GSoap实现ONVIF
- 在用于格式4的arm模拟器中实现功能时的一个问题
- 用于AVX的ln(x)的实现,m256
- 用常见虚拟函数实现的任意组合来实现派生类的正确方法是什么
- 在C++中,如何在类和函数(可能是模板化的)的头中编写完整的实现
- 如何在QT中为自定义模型实现removeRow()函数