Qt官方案例知识点总结(图形视图——Colliding Mice)

发布于:2025-04-20 ⋅ 阅读:(15) ⋅ 点赞:(0)

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鼠标可以拖出一个矩形区域并且会使得场景自动选择这个矩形区域内的图元


网站公告

今日签到

点亮在社区的每一天
去签到