Colliding Mice 案例
图元可重写下面的方法,返回一个QPainterPath(形状),该形状基于图形项自己的坐标系
返回的形状用于碰撞检测、命中测试等,形状越精确,那么碰撞检测等就越准确
不重写的话,默认取 boundingRect()方法返回的矩形
[virtual] QPainterPath QGraphicsItem::shape() const
比如下面返回1个椭圆:
QPainterPath Mouse::shape() const
{
QPainterPath path;
path.addEllipse(-10, -20, 20, 40);
return path;
}
---------------------------------------------------------------------------------------------------------------------------------
场景有下面的一个槽函数advance(),这个槽函数在调用时,会调用场景里面所有图元的advance()方法,通常搭配QTimer,或者QTimeLine,来重复调用advance方法,从而实现简单的动画
[slot] void QGraphicsScene::advance()
图元可重写下面的方法,(比如在里面改变位置,每次设置不同的位置,这样图元就动起来了)
[virtual] void QGraphicsItem::advance(int phase)
固定的写法是:(phase参数不必太在意)
void advance(int phase) override
{
//参数phase在场景第一阶段调用时,会传0,为0直接return
if (!phase)
return;
//改变位置,大小,
}
--------------------------------------------------------------------------------------------------------------------------------
下面的方法用来设置场景给item应用索引的方式
用来加快 items() 和itemAt()等图元查找函数
void QGraphicsScene::setItemIndexMethod(QGraphicsScene::ItemIndexMethod method)
method有两种
- QGraphicsScene::BspTreeIndex:查找图元快,是对数时间,但是移动,添加,删除图元是对数时间,适合静态场景,即大多数图元不会移动
- QGraphicsScene::NoIndex:查找图元是线性时间,会遍历所有图元,图元越多越慢,但是移动、添加、删除图元是常量时间,适合动态场景,即许多图元会被不断地添加、移动和删除。
--------------------------------------------------------------------------------------------------------------------------------
下面的函数用来给视图设置缓存模式
void QGraphicsView::setCacheMode(QGraphicsView::CacheMode mode)
- QGraphicsView::CacheNone:默认的缓存模式,视图不会缓存任何内容,每次重绘时,视图会重绘整个场景,适合场景内容会频繁变化
- QGraphicsView::CacheBackground:视图会对场景的背景进行缓存,当时视图需要重绘时,会优先使用缓存的背景,只有在背景发生变化时才重新绘制背景,适合场景背景复杂(比如带透明度的)但不经常变化时,该模式可以提高重绘性能,比如一个地图应用程序,地图的背景图层通常是固定的,只有一些动态的元素(比如车辆,标记)会发生变化
--------------------------------------------------------------------------------------------------------------------------------
下面的函数用来设置视图视口的更新模式,控制图形场景的渲染区域和优化性能。不同的模式会影响 Qt 如何检测和更新需要重绘的区域,适用于不同场景下的性能优化和渲染需求。
void QGraphicsView::setViewportUpdateMode(QGraphicsView::ViewportUpdateMode mode)
--------------------------------------------------------------------------------------------------------------------------------
确定鼠标在视图上点击后再滑动的行为
void QGraphicsView::setDragMode(QGraphicsView::DragMode mode)
- QGraphicsView::NoDrag:没有任何行为,可以自己重写鼠标事件自定义行为
- QGraphicsView::ScrollHandDrag:鼠标可以滚动视图的内容,如果场景大于视图
- QGraphicsView::RubberBandDrag:鼠标可以拖出一个矩形区域,并且会使得场景自动选择这个矩形区域内的图元