• 6638阅读
  • 7回复

model内的数据量很多时,当鼠标在QTreeView内移动后停止响应1秒多 [复制链接]

上一主题 下一主题
离线ainopara
 
只看楼主 倒序阅读 楼主  发表于: 2012-02-06
model是QSqlQueryModel
这种情况在行的数量超过1000的时候开始出现。
停止响应应该是因为程序在处理大量的数据
停止响应出现的条件是:
1.鼠标什么都没按在QTreeView内移动,当移动停止的时候出现停止响应。
2.鼠标按下左键在在QTreeView内移动,移动停止也没事,但是在松开左键的时候出现停止响应的情况。
根据这些条件我的判断是QTreeView在与鼠标相关的事件中进行了数据库的查询。
但是根据这2个条件我不是很清楚到底问题是在哪出现的,可以避开这种查询吗?
离线XChinux

只看该作者 1楼 发表于: 2012-02-06
要不你可以用fetchMore()多获取些数据?
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线ainopara
只看该作者 2楼 发表于: 2012-02-06
一共2000行数据,实际上一开始QTreeView缓存的行数不是那么多的时候没有这个问题。
向下拖动滚动条(或者使用filter)会让model自动读取下面的数据(调用fetchMore),就是在数据量超过一定数量后,就开始出现这种情况了。另外:
当鼠标从QTreeView外面移动进QTreeView的时候(确切说是移动进来并鼠标停在QTreeView的一个固定地方之后)会卡。
鼠标从QTreeView移动到外面不会卡。
刚刚又试了下,卡顿的时间和QTreeView(QTableView也一样)缓存的行数成正比。
毫无疑问QTreeView在鼠标在其中停下来后对其model进行了访问或者处理(总觉的单纯的访问不至于这么慢,1000行的数据就有明显的卡顿现象的处理难道是1000次sort一类的?)。我很疑惑QTreeView到底把时间浪费在哪了。。
离线ainopara
只看该作者 3楼 发表于: 2012-02-07
刚刚试了下重新实现了model的rowcount。
在卡的那段时间内,rowcount被调用了3W次。
而我的数据是2000行5列。尽管我已经把rowcount变成不能再简化的一个函数了,还是会卡。除了rowcount这3W次调用,还有哪些函数被调用了?被谁调用了?
离线ainopara
只看该作者 4楼 发表于: 2012-02-07
刚刚发现原来model的rowcount的调用次数不是3W而是230W
会卡完全是因为大量的调用了rowcount函数,尽管rowcount已经足够快了。
流程大概是:
鼠标在view里停下来 - viewportEvent - 大量的rowcount - viewportEvent - (如果鼠标停在数据上,则还会调用一次data)
离线dongchen
只看该作者 5楼 发表于: 2012-05-12
虽然没有人回答解决这个问题,但是楼主自己慢慢摸索,慢慢解决。这样很好,要是每个人都像楼主那样,都把问题放出来就好了。这样大家都可以相互学习。
离线huoyanlie
只看该作者 6楼 发表于: 2012-06-05
这个貌似是你在加载数据的时候,会不停地将当前界面所有可见Item进行重绘造成的。


最直观的就是你在insertRow或者是appendRow的时候都会调用insertRows这个接口,基本上时间都是耗在这里的
离线ogred3d
只看该作者 7楼 发表于: 2012-08-14
我试出来了。
Qt
快速回复
限100 字节
 
上一个 下一个