QCanvas的QCanvas::advance()与QCanvas::setAdvancePeriod(int ms)[virtual]配合使用,即设置canvas每隔ms毫秒调用一次advance(),可以通过调用setAdvancePeriod(int ms)或setUpdatePeriod()来进行预先设置。
QCanvas的QCanvas::update()与QCanvas::setUpdatePeriod(int ms)[virtual]配合使用,即设置canvas每隔ms毫秒调用一次update(),可以通过调用setAdvancePeriod(int ms)或setUpdatePeriod()来进行预先设置。
void QCanvas::update()[virtual slot]刷新canvas所有视图的所有更改。
void QCanvas::advance()[virtual slot] 提升一次在canvas所有项的动作,并且刷新canvas所有视图的所有更改。
advance分两个阶段(或两种状态进行),在0阶段,每个动画项以参数0的形式来调用QCanvasItem::advance()这个函数,在1阶段,以参数1的形式再调用一次这个函数。在0阶段,这些项将不会改变位置,仅仅检测其它在canvas的QCanvasItem是否有特殊的处理请求,比如说项目之间的碰撞。在1阶段,canvas的所有项将会改变位置,忽略在canvas上的任何其它项。两步平等调用,如果没有QCanvasItem子类提供,那么Qt在0阶段也不会做任何事。
QCanvasItem是一个在QCanvas上的抽象图形对象。
一个QCanvasItem对象能够通过诸如move(),moveBy(),setY()等一些函数移动变换x(),y()及z()各维的值,来达到移动到某一点的目的。它通过boundingRect()来得到大小。运用setAnimated()及setVelocity(),它能够自动的移动或更改外观,你也可以通过collidesWith()及collisions()来得到它是否有碰撞等信息。
最后,rtti()函数是被运用于标识QCanvasItem子类,并且canvas()返回一个指向该Item所在的canvas的指针.
对于一个item,默认情况下是没有速度,没有大小,没有动画和没有速率的。
注意:你不能够很容易直接从QCanvasItem继承来生成一个子类,这是因为它的API是很低级的。取而代之的是,你可以从QCanvasPolygonalItem或者QCanvasRectangle,ACanvasSprite直接继承来得到子类。
QCanvasItemList QCanvasItem::collisions(bool exact) const
返回一个与自身相碰撞的items列表.
碰撞(collision)一般定议成一个item的像素绘制在其它item的像素上,但不是所有的子类都是如此精确的。同样,因为碰撞检测很慢,所以通过exact参数,可以让这个函数工作在精确模式下或非精确模式下。
在精确模式下,返回一些被精确检测出与本item相碰撞的items。
在非精确模式,返回的一些items是与当前item仅仅是接近和用collidesWith()将会被检测到有碰撞的可能的候选items.通过这个模式,你可以忽略掉那些不可能有碰撞的items.
返回值仅仅是一个QCanvasItem的链表,但是通常你会把它们转换成一些更有用的类型。安全的转换方式是在转换之前用rtti()来标识。即使在不是很有效的编译器,这里也提供了一些标准C++功能性的动态转换操作。
注意:碰撞检测只对存在于canvas区域里的item进行。
QCanvasView
一个观看QCanvas的一个组件。
显示QCanvas的视图,可使用滚动条。可以放置多个canvas的视图。
这个canvas视图是用户看得到的,并能与之交互的对象,因此,任何交互性都是基于一个视图的事件。举个例子,通过QCanvasView的子类重载QScrollView::contentsMousePressEvent(),一个应用可以提供一个用于用户交互的items所在的canvas。
void MyCanvasView::contentsMousePressEvent(QMouseEvent* e)
{
QCanvasItemList list = canvas()->collisions(e->pos());
if ( !list.isEmpty() ) {
QCanvasItem* item = list.first();
// Process the top item
...
}
}
QCanvasView拥有QScrollView子类所具有的功能。