• 14973阅读
  • 18回复

QTreeView的性能真是不敢恭维,有谁能解决 [复制链接]

上一主题 下一主题
离线fjb2080
 

只看楼主 倒序阅读 楼主  发表于: 2011-04-14
做了个小软件,功能是这样的:
扫描磁盘,并把得到的信息实时的用QTreeView显示出来

刚开始,数据少的时候察觉不出来,当数据量很大的时候,这是性能严重下降

用windows的资源管理器来查看程序运行,发现cpu使用50%,内存直线上身,到100M左右,程序基本僵死

用QTreeWidget死的更快

看到内存消耗那么多,还以为是自己程序问题,后改为控制台下扫描和输出,一点问题都没有
又以为是线程和信号问题,最后排查到了QTreeView的问题

后来这样解决:
先扫描数据并保存下来
扫描完了之后在建立model
建完model后再在QTreeView->setmodel

这样在扫描时,基本界面没问题,内存下降一半以上,不影响程序运行

但出现另外一个问题,当数据量很大时,在做完QTreeView->setmodel后,cpu重新彪上%50,内存也彪上一倍,基本不可能拖动treeview来浏览数据,界面几近僵死

而且这样的先扫描后建立的做法,本来就不直观,不如一扫描到数据就显示在treeview来的好,但又有什么办法呢

难道就没有一个好的方法解决QTreeView的性能的问题吗,高手回答一下
离线浪漫天使
只看该作者 1楼 发表于: 2011-04-14
弱弱的问一下 控件treeView怎么显示你说的实时信息的?为什么是用treeView控件呢?
离线fjb2080

只看该作者 2楼 发表于: 2011-04-15
回 1楼(浪漫天使) 的帖子
扫描到一条信息,然后把这个信息插入treeview中,让treeview显示出来
用树控件是因为信息有多条属性,需要多个列显示
离线浪漫天使
只看该作者 3楼 发表于: 2011-04-15
表格合适吗?
离线oscarboycn

只看该作者 4楼 发表于: 2011-04-22
避免在GUI中进行耗时操作,耗时操作请移动至子线程
http://www.21ic.com
http://bbs.eetop.cn
http://www.eetop.cn/
http://www.eet-china.com/
http://www.netyi.net/
http://www.pcbbbs.com/
http://www.pcbtech.net/
离线XChinux

只看该作者 5楼 发表于: 2011-05-10
model你用的是什么?
数据量是大?还是频繁?
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线jgcddd

只看该作者 6楼 发表于: 2011-11-11
我也用QTreeView 做的实时数据的显示,现在我遇到的问题是 当我更换条件时,我想让里面的数据能跟据条件实时做出变化,现在的情况是一但条件变化了,实时数据也出来,但原来的数据还在,不过是在真实数据的下面。
离线jgcddd

只看该作者 7楼 发表于: 2011-11-11
发个图给楼主看一下,能不解决。
离线jdwx

只看该作者 8楼 发表于: 2011-11-11
多线程扫描,定时刷新1-2秒一次。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线jorneyr

只看该作者 9楼 发表于: 2011-11-11
Re:回 1楼(浪漫天使) 的帖子
引用第2楼fjb2080于2011-04-15 14:38发表的 回 1楼(浪漫天使) 的帖子 :
扫描到一条信息,然后把这个信息插入treeview中,让treeview显示出来
用树控件是因为信息有多条属性,需要多个列显示

这样当然会占用很多CPU,每加一条信息都会提示Qt更新界面,虽然更新事件会压缩,但是相对还是太频繁,不只是Qt,用任何软件都会这样。
你可以把更新的速度变为扫描到后先保存,如有50条,100条再一次性更新这一批数据,扫描部分放在一个新线程里,不要让它冻结界面。


离线jorneyr

只看该作者 10楼 发表于: 2011-11-11
Re:回 1楼(浪漫天使) 的帖子
引用第2楼fjb2080于2011-04-15 14:38发表的 回 1楼(浪漫天使) 的帖子 :
扫描到一条信息,然后把这个信息插入treeview中,让treeview显示出来
用树控件是因为信息有多条属性,需要多个列显示

再给楼主一个方法,使用动态加载,可以参考一下我写的例子,这个是用于QTableView的,在QTree里作一下适当修改也可以适应http://www.cppblog.com/biao/archive/2011/10/27/159196.html
离线zhy282289
只看该作者 11楼 发表于: 2011-11-11
没正确用model/view,不管CPU和内存多少你界面都不应该死掉,
我读数据1000W条都1G,显示没什么问题啊
为什么我脸这么胖~
离线jdwx

只看该作者 12楼 发表于: 2011-11-11
回 11楼(zhy282289) 的帖子
楼主是动态显示不停的刷新,估计你的是静态显示。
发帖时要说明:操作系统、Qt版本、编译器,这样能更快的得到回复。
离线qijialin
只看该作者 13楼 发表于: 2011-11-23
回 6楼(jgcddd) 的帖子
你的问题解决了没有?
离线XChinux

只看该作者 14楼 发表于: 2011-12-20
关键点:
1、model必须高效,所以要看你的代码是否有必要写自定义model(不要用QStandardItemModel,数据量大是就不合适了)
2、在model中要确保,每次更新数据时,只发送信号通知view只变化了的区域。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线蠢蠢欲懂
只看该作者 15楼 发表于: 2012-05-07
回 4楼(oscarboycn) 的帖子
在GUI中的耗时,体现在什么地方?
离线ogred3d
只看该作者 16楼 发表于: 2012-08-19
Qt
离线zxh1982a

只看该作者 17楼 发表于: 2012-10-30
回 14楼(XChinux) 的帖子
你好,想问一下你说的第2条,怎么才能通知view更新变化了的区域呢?能给点代码举例吗?
离线hohos

只看该作者 18楼 发表于: 2012-11-07
引用第14楼XChinux于2011-12-20 21:08发表的  :
关键点:
1、model必须高效,所以要看你的代码是否有必要写自定义model(不要用QStandardItemModel,数据量大是就不合适了)
2、在model中要确保,每次更新数据时,只发送信号通知view只变化了的区域。

顶。。。。

我是大菜,只说下自己的体会:
插入,删除行,应当实现insertRows,removeRows,还有columns等抽象接口,接口内使用beginInsertRows endInsertRows等函数
数据的修改用setData来做
只对变更数据做更新

大数据量在同一线程内自然会造成GUI响应迟缓,应放入子线程并建立相应连接。
必要时实现canFetchMore,fetchMore函数。。。。。(这个没做过,哈哈哈)

快速回复
限100 字节
 
上一个 下一个