在Qt4的model/view架构中,用的非常多的是QModelIndex,但这个类是动态的,可以说不可以传递的,因为随着view的变化,相同结点的QModelIndex也可能不同,非常容易失效,甚至造成读写数据错误的问题。 Qt4中还提供一个QPersistentModelIndex类,说明中这个类可以存储作为结点记录,并且不会因为model的变化而变化,应该也可以当作参数传递。 测试其中nullfxp中试用是否可以。 假如在一个View中的点击事件,点击之后异步更新当前点击的结点, 那么就需要在更新返回的时候正确查找到这个结点。 如果把这个结点的普通QModelIndex传递给异步更新处理器,则返回的时候程序行为 无法预料, 因为model中其他数据可能发生变化,而这个QModelIndex已经失效了,找不到原来的结点,或者找到的结点根本就不是原来结点。 这时候借助QPersistentModelIndex实现该功能,把当前的QModelIndex转换为QPersistentModelIndex: QPersistentModelINdex *persisIndex = new QPersistentModelIndex(index); 然后这个persisIndex可以当作普通指针传递到更新处理器,更新完成返回后使用这个实例查找原来的结点。 或者可以不使用指针,直接使用引用, QPersistentModelIndex persisIndex = QPersistentModelIndex(index); 这样在传递存储的时候有大量的实例拷贝,有一些内存上的动态变化开销。 前者则需要自己管理对象生命期,直到用完delete。 QPersistentModelIndex提供的方法, persisIndex->parent(); 取得结点的父结点的QModelIndex, 这是在本语句执行时最新的view的Index,使用这个值操作不会导致view/model混乱异常。 persisIndex->row(); 结点所在行,也是最新的位置。 persisIndex->column(); 结点所在列,也是最新的位置。 如有需要,代码实现在nullfxp项目中,通过svn访问nullfxp项目源代码可找到可运行的实例。 使用本方法解决前面 http://www.qtchina.net/?q=node/442 中提到的一个bug。

转载于:https://www.cnblogs.com/qtchina/archive/2010/06/16/1759157.html

在Qt4中使用QPersistentModelIndex传递QModelIndex相关推荐

  1. 4.QT4中的connect的实现

    信号槽通过connect进行连接,connect的源码在qobject.cpp中 QT4中的connect的声明如下 static QMetaObject::Connection connect(co ...

  2. Android中事件的传递

    Android中事件的传递 首先来张图看看    1. 核心方法返回值的含义 dispatchTrackballEvent 分发事件 public boolean dispatchTrackballE ...

  3. android post json格式,Android中post请求传递json数据给服务端的实例

    在最近的项目中有个需求是这样的: 入参封装成JSON,EXAMPLE: { "uuid": "iamauuid","clientType": ...

  4. 为什么说 Java 中只有值传递?

    对于初学者来说,要想把这个问题回答正确,是比较难的.在第二天整理答案的时候,我发现我竟然无法通过简单的语言把这个事情描述的很容易理解,遗憾的是,我也没有在网上找到哪篇文章可以把这个事情讲解的通俗易懂. ...

  5. java中是引用传递还是值传递....

    刚才与Z师兄聊天,他提问: 你说java中是引用传递还是值传递啊? 当时俺搞混了这个"传递"的意思, 本来以为是对象的实例化比如: abc a=new abc(); 这个a 是引用 ...

  6. linux中probe函数传递参数的寻找(下)

    点击打开链接 linux中probe函数传递参数的寻找(下) 通过追寻driver的脚步,我们有了努力的方向:只有找到spi_bus_type的填充device即可,下面该从device去打通,当两个 ...

  7. 计算机网络中数据的传递过程

    文章目录 1 计算机网络中数据的传递过程 1.1 计算机网络中整体上的数据传递过程 1.2 计算机协议栈IP模块和路由器对MAC头部的处理 1 计算机网络中数据的传递过程 1.1 计算机网络中整体上的 ...

  8. html5如何传递值,如何将var中的值传递到另一个var

    我在将声明中的值传递给另一个var时遇到问题.不确定的语法.如何将var中的值传递到另一个var 目前在我的代码下面,我的html中的,它什么也没有返回,即空白.但是,如果我将脚本代码更改为$('#x ...

  9. java只有值传递_面试官:为什么 Java 中只有值传递?

    1.为什么 Java 中只有值传递? 首先回顾一下在程序设计语言中有关将参数传递给方法(或函数)的一些专业术语.按值调用(call by value)表示方法接收的是调用者提供的值,而按引用调用(ca ...

最新文章

  1. html生成的超级链接预览功能,超链接特效
  2. 第二十一课.粒子滤波器
  3. 马斯克不仅承包NASA火箭发射,现在连火箭“摆渡车”都换成特斯拉了
  4. python关键字列表的表达式,python 列表推导和生成器表达式的使用
  5. logback常用配置
  6. 安卓项目中文件夹的作用
  7. oracle 事务测试
  8. 小程序开发(5)-之封装组件
  9. C++工作笔记-对全局变量的进一步认识(何时适合用,何时不适合用)
  10. oracle压缩参数,Oracle 11g版本EXPDP 的COMPRESSION参数压缩比堪比“gzip -9”
  11. 解决安装CMake报错:Could not find CMAKE_ROOT !!! CMake has most likely not been installed correctly.
  12. Oracle SUn
  13. 《算法导论》第三版第7章 快速排序 练习思考题 个人答案
  14. JavaScript延时函数
  15. 多边形的定义为什么要强调封闭图形_多边形的定义及其定理
  16. Suse12网络设置
  17. 手机通讯终端软件硬件测试,浅谈基于SWP方案的近场通信终端测试及其方法探究...
  18. 音乐外链生成php,如何使用php生成短链接网址 第三方API
  19. 工业互联网构筑第四次工业革命的基石
  20. 01组团队项目-Alpha冲刺-1/6(wxy)

热门文章

  1. 1-NET UX1000-实战-配置-Lync Server 2010-集成
  2. 使用fpm简单制作自定义rpm包
  3. javascript var变量删除
  4. error: No curses/termcap library found的解决办法
  5. flannel 的连通与隔离 - 每天5分钟玩转 Docker 容器技术(61)
  6. Elasticsearch Windows 环境搭建
  7. Kubernetes Eviction Manager工作机制分析
  8. java中类/对象的初始化顺序以及静态代码块的使用
  9. getchar()函数的返回值赋给char型,用if(ch=getchar() != EOF)测试,输入ctrl+z同样可以结束循环的分析...
  10. USACO 1.4 Packing Rectangles