Qt之QHeaderView自定义排序(获取正确的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之QHeaderView自定义排序(获取正确的QModelIndex)的更多相关文章
- Qt之QHeaderView自定义排序(终极版)
简述 本节主要解决自定义排序衍生的第二个问题-将整形显示为字符串,而排序依然正常. 下面我们介绍三种方案: 委托绘制 用户数据 辅助列 很多人也许会有疑虑,平时都用delegate来绘制各种按钮.图标 ...
- Qt之QHeaderView自定义排序(QSortFilterProxyModel)
简述 对以上节的排序,我们衍伸了两点: 把一个字符串前面的数据按照字符串比较,而后面的数据按照整形比较. 将整形显示为字符串,而排序依然正常呢. 为了分别描述,这里我们先解决问题1. 简述 效果 处理 ...
- 干货之UICollectionViewFlowLayout自定义排序和拖拽手势
使用UICollectionView,需要使用UICollectionViewLayout控制UICollectionViewCell布局,虽然UICollectionViewLayout提供了高度自 ...
- ptyhon 编程基础之函数篇(二)-----返回函数,自定义排序函数,闭包,匿名函数
一.自定义排序函数 在Python中可以使用内置函数sorted(list)进行排序: 结果如下图所示: 但sorted也是一个高阶函数,可以接受两个参数来实现自定义排序函数,第一个参数为要排序的集合 ...
- Qt信号之自定义数据类型
[1]为什么需要自定义数据类型? 内置类型毕竟很有局限性,否则为什么还需要类呢.总之,有时候,我们多么希望信号能发送自定义数据类型. 幸哉~ Qt是支持自定义信号,且自定义信号可以发送自定义数据类型的 ...
- .NET/C#中对自定义对象集合进行自定义排序的方法
一个集合可否排序,要看系统知不知道排序的规则,像内建的系统类型,int ,string,short,decimal这些,系统知道怎么排序,而如果一个集合里面放置的是自定义类型,比如自己定义了一个Car ...
- Qt之创建自定义类型
摘要: 简述 当使用Qt创建用户界面时,特别是那些带有特殊控制和特征的界面时,开发者通常需要创建新数据类型来扩展或替换Qt现有的的值类型集合. 标准类型,比如:QSize.QColor和QString ...
- Lucene 中自定义排序的实现
使用Lucene来搜索内容,搜索结果的显示顺序当然是比较重要的.Lucene中Build-in的几个排序定义在大多数情况下是不适合我们使用的.要适合自己的应用程序的场景,就只能自定义排序功能,本节我们 ...
- Python:Base4(map,reduce,filter,自定义排序函数(sorted),返回函数,闭包,匿名函数(lambda) )
1.python把函数作为参数: 在2.1小节中,我们讲了高阶函数的概念,并编写了一个简单的高阶函数: def add(x, y, f): return f(x) + f(y) 如果传入abs作为参数 ...
随机推荐
- jquery的show/hide性能测试
这篇文章是jQuery各种 show/hide方式的性能测试.作者之所以测试这个源于Robert Duffy在SanFrancisco举行的jQuery大会上的一句话:“.hide()和.show() ...
- php调试工具firephp
PHP调试有很多中方法.今天给大家推荐的是 FirePHP 这个工具,是基于firefox的一个组件.Firephp组件安装地址.使用之前需要先安装下这个组件.完了还需要down一个FirePHP的包 ...
- 【mysql5.6】数据类型
一.数值类型 int(5) 表示显示宽度为5,默认为显示宽度11. zerofill 属性:用0填充前面空位 auto_increment 属性:只用于整数.一般从1开始,每行增加1.一个表最多只能有 ...
- 用Stopwatch类获得程序运行时间
我们可以用Stopwatch类获得程序的运行时间,在优化代码时,可以用此方法来查看优化前后程序所耗费的时间 //Stopwatch类別在System.Diagnostics命名空间里 Stopwatc ...
- tomcat下context.xml中JNDI数据源配置
jndi(Java Naming and Directory Interface,Java命名和目录接口)是一组在Java应用中访问命名和目录服务的API.命名服务将名称和对象联系起来,使得我们可以用 ...
- C# Task的使用---Task的启动
.NET 4.0包含的新名称空间System.Threading.Tasks,它包含的类抽象出了线程功能.任务表示应完成的某个单元的工作.这个单元的工作可以在单独的线程中运行,也可以以同步的方式启动一 ...
- webmatrix
http://www.microsoft.com/web/webmatrix/ WebMatrix is a free, lightweight, cloud-connected web develo ...
- lintcode:恢复IP地址
恢复IP地址 给一个由数字组成的字符串.求出其可能恢复为的所有IP地址. 样例 给出字符串 "25525511135",所有可能的IP地址为: [ "255.255.11 ...
- Project Euler 102:Triangle containment 包含原点的三角形
Triangle containment Three distinct points are plotted at random on a Cartesian plane, for which -10 ...
- 无图片,用css border实现尖三角
<!DOCTYPE HTML> <html> <head> <meta charset="gbk" /> <style typ ...