QSortFilterProxyModel对SourceModel有什么特殊要求?

cddark 2012-02-09 04:48:56
我有三个对象:
一个 tableView(QTableView),
一个 tableModel(继承自QAbstractTableModel),数据会动态增加
一个 proxyModel (QSortFilterProxyModel),并且proxyModel->setSourceModel(tableModel);

1。当tableView->setModel(tableModel); 使用正常

2。当tableView->setModel(proxyModel); 开始一切正常,
但是如果鼠标选中View中某一单元格之后,model数据更新的时候导致crash!

XXX.exe 中的 0x6580eac7 处未处理的异常: 0xC0000005: 读取位置 0x00000019 时发生访问冲突

断点在:

C:\Program Files\Microsoft Visual Studio 9.0\VC\crt\src\free.c

void __cdecl _free_base (void * pBlock)
109行 retval = HeapFree(_crtheap, 0, pBlock);


所以请教一下:QSortFilterProxyModel是不是对SourceModel有什么特殊要求?
比如必须提供哪些方法……
...全文
211 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
cddark 2012-02-13
  • 打赏
  • 举报
回复
是的,找到原因了。
添加数据是可以直接修改model里的数据就行了,不过有个要求:
model行数有变动的时候需要调用 beginInsertRows() 和 beginRemoveRows() 等函数。

看来是以前model用的不严格,没用代理没发现这些问题。一用代理就暴露了。

结。
gauldoth 2012-02-11
  • 打赏
  • 举报
回复
你的Model写得有问题,数据动态添加是怎么个加法?
貌似得通过Model的方法添加数据,而不是直接修改依赖的底层数据结构。
cddark 2012-02-09
  • 打赏
  • 举报
回复
但是点击表头排序,虽然内容排序了,
但是因为点击表头会选择整列,所以下次model数据变化时,还是crash了

过滤没有问题。
cddark 2012-02-09
  • 打赏
  • 举报
回复
补充: 用 QSortFilterProxyModel 的时候,只要不选中item,排序和过滤功能都正常……

16,213

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧