QTableView使用QSortFilterProxyModel后行号错乱

在Qt中,当你使用QSortFilterProxyModelQTableView进行排序或过滤后,点击事件可能会返回一个不正确的行号,因为代理模型可能会改变数据的显示顺序。为了获取点击数据的真实行号和内容,你可以使用mapToSource()函数,它可以将代理模型中的索引映射回源模型中的索引。

以下是如何使用mapToSource()来获取真实行号和内容的步骤:

  1. QTableView中实现点击事件的槽函数。
  2. 在槽函数中,获取点击的代理模型索引。
  3. 使用mapToSource()将代理模型索引转换为源模型索引。
  4. 使用源模型索引来获取真实的行号和数据。

示例代码如下:

cpp 复制代码
void TableView::cellClicked(const QModelIndex &proxyIndex) {
    if (!proxyIndex.isValid())
        return;

    // 将代理模型索引映射到源模型索引
    QModelIndex sourceIndex = proxyModel->mapToSource(proxyIndex);

    // 获取源模型中的真实行号
    int row = sourceIndex.row();

    // 使用源模型索引来获取数据
    QVariant data = sourceModel->data(sourceIndex);

    // 现在你可以使用真实的行号和数据了
    qDebug() << "Real row:" << row << "Data:" << data;
}

在这个例子中,cellClicked是一个槽函数,它在用户点击表格单元格时被调用。proxyModelQSortFilterProxyModel的实例,sourceModel是源模型。mapToSource()函数用于获取源模型中对应的索引,从而可以获取真实的行号和数据。

如果你需要在点击事件中区分左键和右键,你可以重写QTableViewmousePressEvent方法,并在其中检查点击的按钮类型。

相关推荐
爱的叹息2 分钟前
数据库sql执行报错:non-grouping field xxx is used in HAVING clause错误详解
数据库·sql·oracle
PingCAP14 分钟前
PingCAP“一号员工”唐刘:回顾我与 TiDB 的十年成长之旅
数据库·tidb
islandzzzz37 分钟前
使用cmd来创建数据库和数据库表-简洁步骤
数据库
多多*44 分钟前
非关系型数据库 八股文 Redis相关 缓存雪崩 击穿 穿透
java·开发语言·jvm·数据库·redis·缓存·nosql
时序之心1 小时前
清华团队提出时序聚类数据库内高效方案,已被SIGMOD 2025接收
数据库·数据挖掘·聚类
浪前1 小时前
【项目篇之消息持久化】仿照RabbitMQ模拟实现消息队列
java·数据库·rabbitmq·ruby
数据库砖家2 小时前
YashanDB 知识库|轻松打通多库数据,YashanDB DBLink 使用指南!
数据库
二进制_博客2 小时前
高德MCP制作旅游攻略
数据库·旅游
数据库砖家2 小时前
YashanDB 知识库|如何用闪回功能救回误删的数据?全流程实战演示
数据库
数据库砖家2 小时前
YashanDB 知识库|手把手教你回收表空间,释放磁盘的正确姿势!
数据库