Qt之QHeaderView自定义排序(获取正确的QModelIndex)

简介: 简述前几节中分享过关于自定义排序的功能,貌似我们之前的内容已经可以很好地解决排序问题了,但是,会由此引发一些很难发现的问题。。。比如:获取QModelIndex索引错误。下面,我们先来实现一个整行选中的效果。简述错误处理效果源码分析正常处理效果源码错误处理效果下面是一个非正常的的效果,选中当前行会造成更新错误,

简述

前几节中分享过关于自定义排序的功能,貌似我们之前的内容已经可以很好地解决排序问题了,但是,会由此引发一些很难发现的问题。。。比如:获取QModelIndex索引错误。

下面,我们先来实现一个整行选中的效果。

错误处理

效果

下面是一个非正常的的效果,选中当前行会造成更新错误,Why?

这里写图片描述

源码

// 连接信号槽
connect(pTableView, SIGNAL(clicked(QModelIndex)), this, SLOT(onClicked(QModelIndex)));

// 实现选中/不选
void MainWindow::onClicked(const QModelIndex &index)
{
    if (index.isValid())
    {
        // 获取复选框所在的索引
        QModelIndex checkIndex = m_pModel->index(index.row(), CHECK_BOX_COLUMN);
        // 获取复选框选中状态值
        bool bChecked = m_pModel->data(checkIndex, Qt::UserRole).toBool();
        // 更新复选框状态
        m_pModel->setData(checkIndex, !bChecked, Qt::UserRole);
    }
}

分析

从上面的代码中,我们貌似很难发现问题,因为逻辑没有一点问题,那么为什么会造成更新错误的问题呢?其实,最本质的原因是获取索引错误,这里说的索引是指真正的数据源索引,而并非我们看到的选中的索引。

什么意思呢?举个例子,如果我们选中的索引为QModelIndex(1, 0)-上图对应的路径是D:/Qt/image_4.png,因为该索引是我们选中的,也就是排序之后的索引,当我们按照正常思维去更新model的时候,传递的索引也是index(1, 0),这时数据源内部是未经过排序的,也就是说QModelIndex(1, 0)所对应的路径为E:/Qt/image_2.png,所以会造成更新错误。

如果说你没发现问题,那么只能说纯属偶然,源数据的索引行和你选中的索引行相同。

正常处理

效果

这里写图片描述

源码

这里,至关重要的代码mapToSource-通过选中的索引获取数据源对应的索引。

// 连接信号槽
connect(pTableView, SIGNAL(clicked(QModelIndex)), this, SLOT(onClicked(QModelIndex)));

// 实现选中/不选
void MainWindow::onClicked(const QModelIndex &index)
{
    if (index.isValid())
    {
        // 获取数据源对应的索引 - 关键
        QModelIndex sourceIndex = m_pProxyModel->mapToSource(index);
        // 获取复选框所在的索引
        QModelIndex checkIndex = m_pModel->index(sourceIndex.row(), CHECK_BOX_COLUMN);
        // 获取复选框选中状态值
        bool bChecked = m_pModel->data(checkIndex, Qt::UserRole).toBool();
        // 更新复选框状态
        m_pModel->setData(checkIndex, !bChecked, Qt::UserRole);
    }
}
目录
相关文章
Qt实现单击或双击QTableWidge/View表头进行排序
Qt实现单击或双击QTableWidge/View表头进行排序
916 0
|
JavaScript 大数据
Qt+ECharts开发笔记(五):ECharts的动态排序柱状图介绍、基础使用和Qt封装Demo
上一篇的demo使用隐藏js代码的方式,实现了一个饼图的基本交互方式,并预留了Qt模块对外的基础接口。   本篇的demo实现了自动排序的柱状图,实现了一个自动排序柱状图的基本交互方式,即Qt调用js脚本操作html。   本篇demo使用Qt定时器方式,实现数据定时刷新自增,并预留出了定时器间隔参数。   像大数据网页常看的人口增长时间图,收入年度增长时间图等都是这一类。
Qt+ECharts开发笔记(五):ECharts的动态排序柱状图介绍、基础使用和Qt封装Demo
|
C++ 搜索推荐
Qt之QHeaderView自定义排序(QSortFilterProxyModel)
简述 对以上节的排序,我们衍伸了两点: 把一个字符串前面的数据按照字符串比较,而后面的数据按照整形比较。 将整形显示为字符串,而排序依然正常呢。 为了分别描述,这里我们先解决问题1。 简述 效果 处理大小显示 QAbstractTableModel QSortFilterProxyModel 提示 效果 处理大小显示 // 定义GB
1254 0
|
5月前
|
数据安全/隐私保护 C++ 计算机视觉
Qt(C++)开发一款图片防盗用水印制作小工具
文本水印是一种常用的防盗用手段,可以将文本信息嵌入到图片、视频等文件中,用于识别和证明文件的版权归属。在数字化和网络化的时代,大量的原创作品容易被不法分子盗用或侵犯版权,因此加入文本水印成为了保护原创作品和维护知识产权的必要手段。 通常情况下,文本水印可以包含版权声明、制作者姓名、日期、网址等信息,以帮助识别文件的来源和版权归属。同时,为了增强防盗用效果,文本水印通常会采用字体、颜色、角度等多种组合方式,使得水印难以被删除或篡改,有效地降低了盗用意愿和风险。 开发人员可以使用图像处理技术和编程语言实现文本水印的功能,例如使用Qt的QPainter类进行文本绘制操作,将文本信息嵌入到图片中,
191 1
Qt(C++)开发一款图片防盗用水印制作小工具
|
4月前
|
监控 C++ 容器
【qt】MDI多文档界面开发
【qt】MDI多文档界面开发
97 0
|
3月前
|
开发工具 C++
qt开发技巧与三个问题点
本文介绍了三个Qt开发中的常见问题及其解决方法,并提供了一些实用的开发技巧。