zoukankan      html  css  js  c++  java
  • 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);
        }
    }
  • 相关阅读:
    海康API——获取监控点预览取流URL,获取的rtsp流不能播放
    MySQL——ON DUPLICATE KEY UPDATE添加索引值实现重复插入变更update
    maven——pom.xml的Missing artifact net.sf.json-lib:json-lib:jar:2.4 报错问题(两种有效的解决方案)
    Mysql——navicat如何导出mysql数据表结构
    MySQL——导入导出.sql文件
    仅用U盘就可以去除XP管理员密码
    测试

    navicat 或者workbench 无法连接127.0.0.1(61)的解决方法
    在linux中添加ftp用户,并设置相应的权限
  • 原文地址:https://www.cnblogs.com/itrena/p/5938360.html
Copyright © 2011-2022 走看看