有关QCanvas类的介绍

QCanvas类介绍:

QCanvas类提供了一个2D的绘图区域,能够包含QCanvasItem对象

 

   QCanvas类负责管理2D图形区域和在其区域中的所有的图元项。Canvas没有自己的视觉外观。但是可以通过QCanvasView类在屏幕上显示它。多个QCanvasView不就可以关联到同一个Canvas中,多个视图可以查看同一个Canvas.

Canvas优化了大量的Item项,特别的是在只有一小部分Item改变时所作的优化。如果整个显示经常变化的话,你应该考虑写自己的自定义的QScrollView子类进行处理。

Qt提供了丰富的Canvas图元项,例如:QCanvasEllipseQCanvasLineQCanvasPolygonQCanvasPolygonalItemQCanvasRectangleQCanvasSplineQCanvasSpriteQCanvasText等等。你可以子类化以上类来实现自己自定义的Canvas图元项;QCanvasPolygonalItem类经常用于这种情况,来实现自定义的QCanvasPolyonalItem类。

只有当canvasshow()函数被调用后并且调用updata()函数进行重绘时,才能在canvas上显示其所包含的Item项。Canvas只能在updata被调用时才显示可见的Item项。(默认的canvascanvasItem都是白色的,所以如果看不到的话可以尝试改变它们的颜色。)

如果你没有通过固定的宽度、高度去构造canvas的话,你还必须调用resize()函数。

尽管canvas类似于在窗口中的一个小部件,但与部件有一些不同:

  • Canvas Item常常比部件有更快的操作和重绘效率,尤其是当有很多canvas Item时执行效率有很大的优势。在一些场景中canvas Item会比部件更有效率。
  • 它更容易去检测重叠的Item项(如:碰撞)
  • Canvas可以超过部件在某些方面,如实现成百上千的canvas是完全可以的。在这样的条件下部件的执行效率将会相当的低,还有不被窗口支持的可能,相比而言QCanvas这方面做得很好。即使有十亿像素和一百万个项,去找指定的项、检测碰撞等QCanvas仍旧很有效率的完成。(当然在如此极端的情况下内存消耗很大可能被禁止)
  • 两个或者更多个QCanvasView对象可以查看相同的canvas
  • 一个任意的transformation matrix能够随意的设置到QCanvasView中,使他能够缩放、旋转或者剪切canvas等。
  • 部件提供了许多的功能,如输入(QKeyEventQMouseEvent等)和布局管理(QGridLayout等)

 

     一个canvas由背景、前景、若干的canvas Item项的x/y/z坐标系构成。

     一个canvas Item项的z坐标被当作一层 —— 高的z坐标值代表较高的图层。

默认的背景颜色是白色的,但我们可以用setBackgroundColor()函数去设置不同的颜色,或者通过函数setBackgroundPixmap()设置一张图片作为背景,或者通过函数setTiles()设置马赛克。个别的马赛克块可以用setTile函数进行设置。相应的获取函数有:backgroundColor()backgroundPixmap()。

注意QCanvas类没有继承自QWidget类,即使有一些函数的功能类似于QWidget的函数。其中一个就是setBackgroundPixmap函数;其他的如resize(),size(),width()和height()。QCanvasView常用于在屏幕上显示一个canvas的。

Canvas Item项通过canvas的构造函数被加载到canvas中。一个Item项能够被移动到不同的canvas中通过函数QCanvasItem::setCanvas()函数。

继承自QCanvasItem类的Item项是可以移动的(对于QCanvasSprites动画)。每个Item项在canvas中都有浮点数表示的xy坐标和z坐标。移动一个canvas Item项的xy,可以使其坐标超出canvas的范围(如:QCanvasItem::x()超过width())。当一个Item项超出了范围,onCanvas函数将返回FALSE并且canvas将视该Item不存在于其中(canvas不会减缓在其中的Item项的执行)。

Item项能够被移动通过调用QCanvasItem::move()函数。函数advance()能够移动所有的项通过调用QCanvasItem::animated函数,并且能够通过setAdvancePeriod()函数定期的自动移动Item项。在QCanvas类的上下文中,去设置item项的移动,例如用QCanvasItem::setVelocity()函数。通过调用QCanvasSprite::setFrameAnimation()函数canvasitem项目将随着时间的变化进行移动。更多的是去子类化并且重新实现QCanvasItem::advance()函数。检测碰撞的函数QCanvasItem::collisions函数。

update()函数被调用时,canvas将会进行重绘(如果它们在canvas视图是可视的)。你可以手动的调用update进行重绘,或者使用setUpdatePeriod()函数定期的去重绘它。如果要在canvas中移动对象,你必须一直去调用advance()函数,这个对象将会在调用之后进行移动。周期的调用advance函数可以强制使用setAdvancePeriod函数进行实现。Advance()函数将调用QCanvasItem::advance函数在任何时刻,并作用到受影响的区域。(canvas的动画只是简单的Itemcanvas中的移动罢了)

QCanvasitem项组织成为一个大的块;用于在canvas上面的一个区域进行快速的操作。许多的操作被分解为操作很多的块(它们已经被改变的),然后只处理已经变化的块。判断在canvas上的可用块,调用validChuck函数。

 

块的大小是影响QCanvas操作效率的一个关键因素:如果有很多的块,把canvas中的块归类成不同的块从而提升效率。如果图块很大,就需要很多的时间去处理它。这时,canvas将试图选择合适的大小去处理它,但是你可以随时改变通过调用函数retunechunkSize()函数返回当前的图块的大小。Canvasitem项能够确保它们有一个合适的尺寸;所有你需要去确认的在canvas中用的的块的尺寸。一个好的规则是图块的尺寸略小于item项的尺寸。如果你需要移动对象,图块的大小应该小于item项的平均的大小。

 

前景通常的没有的,但如果你重写了drawForeground()函数,你就可以在前景中绘制一些item项。

 

设置一个可改变的区域和不可改变的区域调用setChanged()setUnchanged()函数。如果设置全部的话用函数setAllChanged()。调用allItem()函数返回所有在canvas中的item项。

 

通过drawArea()函数可以绘制一个区域。

 

如果canvas的大小发生改变将发出resized()信号。

 

Canvas的一些2d绘图例子和demo可以在QCanvas的相关目录中查看。

 

也可以看QCanvasViewQCanvasItemAbstract Widget ClassesGrphics ClassesImage Processing Classes等类进行了解。


    初学Qt,望各位大大们指点。如有不足的地方望指教,和大家共同交流。Email:qixiaoyu718@163.com


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值