QGraphicsItem中的碰撞检测描述

 

QGraphicsItem中的碰撞检测描述

    QGraphicsItem是图元基类。QGraphics View框架提供了几种标准的图元,如矩形(QGraphicsRectItem、椭圆(QGraphicsEllipseItem)和文本图元(QGraphicsTextItem)等。用户可以继承QgraphicItem实现符合自己需要的图元。

QGraphicsItem具有以下功能:

  • 处理鼠标按下、移动、释放、双击、悬停、滚轮和右键菜单事件

  • 处理键盘输入事件

  • 处理拖放事件

  • 分组

  • 碰撞检测

  图元有自己的坐标系统,也提供场景和图元、图元与图元之间的坐标转换函数。图元可以包含子图元。

 

    要创建自己的图元,必须首先创建QGrahicsItem的一个子类,然后开始实现他的2个纯虚函数。一个是boundingRect(),用于返回图元绘制所需要的估测区域。另一个是paint,它实现实际的绘图操纵。举例:

class SimpleItem : public QGraphicsItem
{
public:

QRectF boundingRect() const
{

qreal penWidth = 1;
return QRectF(-10 - penWidth / 2, -10 - penWidth / 2,
20 + penWidth / 2, 20 + penWidth / 2);

}

void paint(QPainter *painter, const QStyleOptionGraphicsItem *option,
QWidget *widget)
{

painter->drawRoundedRect(-10, -10, 20, 20, 5, 5);

}

};

    boundingRect函数有几个目的。QGraphicsScene的图元索引就是建立在boundingRect的基础上。QGraphicsView也使用这个函数来从视图上将不可见的图元移去,以及在绘制重叠的图元时决定需要重新组织的区域。另外,QGraphicsItem的碰撞检测机制(collision detection)使用boundingRest来提高高效的处理。更好的碰撞检测算法是基于shape函数的调用,shape函数将图元的形状的准确外观以QPainterPath返回。

    QGraphicsScene认为所有图元的boundingRect函数与shape函数都是不发生改变的,除非用户进行通知。如果你想改变一个图元的范围,必需先调用prepareGeometryChange以允许QGraphicsScene进行更新。

碰撞检测可以通过以下两种方式实现:

  • 重新实现shape函数返回一个准确的图元外观形状,依赖collidesWithItem函数进行缺省的碰撞检测,如果形状非常的复杂,该检测将是非常耗时的。
  • 重新实现collidesWithItem函数,为自己的定制图元编写碰撞检测算法。

 

对于多点成线的图元可以使用下面的方式返回shape。

QPainterPath path;
//直线的绘制路径
if (m_pointList.count()>0)
{

int iSize;
iSize = m_pointList.size();
path.moveTo (m_pointList[0]);

for(int i=1;i<iSize/2;i++)
{
    path.lineTo (m_pointList[i*2]);
}
for(int i=iSize/2;i>=1;i--)
{
    path.lineTo (m_pointList[i*2-1]);
}
path.closeSubpath();

}
return path;

你可能感兴趣的:(框架,算法,Class,Path)