当前位置: 代码迷 >> QT开发 >> 在QGraphicsItem这种绘图机制上加载大量数据时时间过长
  详细解决方案

在QGraphicsItem这种绘图机制上加载大量数据时时间过长

热度:30   发布时间:2016-04-25 04:18:05.0
在QGraphicsItem这种绘图机制下加载大量数据时时间过长
我做了一个QGraphicsView用来显示大量的图形数据,数据量大概能达到10万条以上。
我试过在程序里加载数十万个QGraphicsItem,发现在绘制的时候,耗费的时间很长,想问一下各位大侠有没有什么好的处理方法。

我想了一种方法,由于QGraphicsView框架每次只绘制可见的图元,当QGraphicsView框架更新视图中的图元时,调用我的一个后台管理接口,用来更新一些后台数据,然后QGraphicsView框架再调用每个图元的Paint,不知有没有这种方法,主要我不想一次加载所有的QGraphicsItem

请各位大侠不吝赐教
------解决方案--------------------
可以的,你可以开一个线程处理你的数据,一旦数据更新完成即可更新。但是如此大的数据量在初次载入的时候的确绘制很慢。OpenGL对于如此大的数据量也挺吃力的。
------解决方案--------------------
最开始的时候,我使用了这样的一种方法来进行处理:
QGraphicsView每次更新视图内的图元时,会调用所有图元的paint接口,我在后台有一个数据管理类,当QGraphicsView调用图元的paint时,被调用的图元会先向我的数据管理类请求更新自己的后台数据,然后在得到新的后台数据后,开始自己的绘制动作。

这样做之后,我发现每次更新视图的效率会变的低下,跟人一种很不流畅的感觉。
所以我在想,QGraphicsView每次更新视图是不是应该要先计算出当前的视图区域应当显示出多少个图元,而后才驱动这些图元进行自我绘制。如果是这样,当视图计算出当前试图区域中应有多少个图元时,会不会发出一些信号,这样我就可以处理这个信号,来达到更新我后台数据的目的,这样我就可以将原来在paint接口中执行的更新后台数据的工作,转移到这个信号的处理中去,从而大大的提高的绘图效率
------解决方案--------------------
这个Qt的Demo对你有帮助吗?40000 Chips
------解决方案--------------------
QGraphicsView对于实时绘制加载大量QGraphicsItem数据,目前来说是比较慢的,LZ所想的那种方法是可行的(游戏里面叫做裁剪,OpenGL是有这种东西的),不过这种方法QGraphicsView目前还没有这种机制得自己去实现