Qt之QHeaderView自定义排序(获取正确的QModelIndex)
来源:互联网 发布:网络教育录取查询 编辑:程序博客网 时间:2024/04/30 13:45
简述
前几节中分享过关于自定义排序的功能,貌似我们之前的内容已经可以很好地解决排序问题了,但是,会由此引发一些很难发现的问题。。。比如:获取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); }}
3 0
- Qt之QHeaderView自定义排序(获取正确的QModelIndex)
- Qt之QHeaderView自定义排序(QSortFilterProxyModel)
- Qt之QHeaderView自定义排序(终极版)
- Qt之QHeaderView排序
- Qt中由表中单元格的QModelIndex获取Global Pos的正确方法
- Qt中文手册 之 QHeaderView
- 自学QT之获取正确的文件名
- Qt之QHeaderView添加复选框
- Qt笔记-TableView(QHeaderView QSS)
- 一 QT之QTableView用QHeaderView添加横向表头
- Qt QHeaderView 表头添加复选框
- QHeaderView的visualIndex和logicalIndex
- QHeaderView样式表的使用
- QT自定义QTableView的排序方式
- QT自定义QTableView的排序方式
- QT自定义QTableView的排序方式
- Qt自定义控件之------QProgressBar的自定义
- 【Qt】Qt之自定义界面(添加自定义标题栏)【转】
- html 标签属性大全 (完美版)
- Redis Windows下的安装使用
- C++第二次作业
- 事件(CEvent)——MFC
- c++第二次作业
- Qt之QHeaderView自定义排序(获取正确的QModelIndex)
- BZOJ1180OTOCI
- C++ vector
- 淘宝的样式初始化:
- servlet的生命周期,和工作原理
- 网页编码乱码
- 可重入函数与线程安全
- 注解知识点总结
- C++第二次试验——ATM模拟