3.Qt WebKit之QGraphicsWebView
本节叙述如何通过Qt的QGraphicsWebView实现分片底衬存储区(tiled
backing store)。
如上静态类图所示,只有实现了分片底衬存储区客户端(TiledBackingStoreClient)的接口的WebCore::Frame才拥有分片底衬存储区实例。其他类只能通过WebCore::Frame发消息给分片底衬存储区。
QGraphicsWebView是QGraphicsWidget的子类. 它被用于显示屏幕上的可见内容。
3.1 按照内容重置QGraphicsWebView的大小(Resize
to Content)
resizesToContents(布尔变量)是QGraphicsWebView的属性。 当使用分片策略时, QGraphicsWebView用来充当我们的内容,它应当按照main
frame内容立即重置自己的大小。
如Qt4.7文档所说, 如果设置此属性, QGraphicsWebView将自动按照main frame的尺寸设置自己的大小。结果就是,顶层的frame绝不会有滚动条。这样就会使得CSS的定点定位(fixed positioning)看起来就像是绝对定位(absolute positioning)--元素相对文档而不是视图端口定位。
如果resizesToContents设置为true, 一旦Frame的内容发生改变,WebCore::FrameView 就会通知QGraphicsWebView去更新自己的大小。
3.2 绘制过程
以下是绘制QGraphicsWebView所需步骤:
- 按照QGraphicsWebView坐标计算可见区矩形。因为QGraphicsWebView按照frame内容的大小重置自己的尺寸,当QGraphicsWebView滚动或者缩放时,可见区矩形随之改变。分片底衬存储区创建瓦片需要这样的可见区域。
- 确保整个可见区域被瓦片覆盖。对于那些没有被瓦片覆盖的可见区域, 它将重复创建最靠经视图端口中心的瓦片,直到所有可见区域被覆盖。距离的计算方法是基于Manhattan距离算法(Manhattan
distance)。为了尽可能不阻塞绘制操作,瓦片创建采用异步执行方式,体现在分片底衬存储区,异步方式是通过启动分片底衬存储区定时器实现的分片底衬存储区:startTileCreationTimer.
- 把frame的内容绘制到每一个瓦片的后缓冲区,通过这样的方式来更新瓦片,当然更新也是异步方式。
- 由Qt画笔的drawPixmap函数来绘制后缓冲区
原文:http://xbfp2b2n.blog.sohu.com/196617339.html