相关文章推荐
失眠的芹菜  ·  java ...·  11 月前    · 
直爽的柿子  ·  windbg使用问题 - ...·  1 年前    · 
QRectF Graphic::boundingRect()const{
    qreal penWidth=1;
    return QRectF(0-penWidth/2,0-penWidth/2,
                  100,130);
void Graphic::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){
    painter->drawImage(QRectF(0,0,100,130),QImage(":/img/plane.png"));


图形视图框架提供了图形项之间的碰撞检测,碰撞检测可以使用两种方法来实现:
1.重新实现QPainterPath QGraphicsItem::shape()函数来返回图形项准确的形状,然后使用默认的collidesWithItem()
函数通过两个图形项形状之间的交集来判断是否发生碰撞。如果图形项的形状很复杂,那么进行这个操作是非常耗时

2.如果没有重新实现shape()函数,那么它默认会调用boundingRect()函数返回一个简单的矩形。

这次就用boundingRect进行判断。

伪代码如下:

void Graphic::keyPressEvent(QKeyEvent *event){
    if(event->key()==Qt::Key_Down){
        moveBy(0,10);
    if(event->key()==Qt::Key_Up){
        moveBy(0,-10);
    if(event->key()==Qt::Key_Left){
        moveBy(-10,0);
    if(event->key()==Qt::Key_Right){
        moveBy(10,0);
    QList<QGraphicsItem *> list = collidingItems();
    if(!list.isEmpty()) {
        list.at(0)->hide();
}
其中collidingItems返回与这个之碰撞的所有图像! 因为要做一个游戏,在线只是一个知识点例子,作下笔记而已。只给出伪代码,游戏作玩,开源发布!!!这里有2个知识点一个是QGraphicsItem的绘图。一个是QGraphicsItem的碰撞。实现绘图要重写:boundingRect()和paint();一定要保证所有的绘图都要在boundingRect()的边界之中。本次绘图代码如下:QRectF Graphic::boundingRect()co...
三个碰撞检测函数 该图形项是否与指定的图形项碰撞 bool QGraphicsItem::collidesWithItem(const QGraphicsItem *other, Qt::ItemSelectionMode mode = Qt::IntersectsItemShape) const 该图形项是否与指定的路径碰撞 bool QGraphicsItem::collidesWithPath(const QPainterPath &path, Qt::ItemSelectionMode m
事件传播顺序:视图接收,传给场景,再传给相应的图形项。 键盘事件传递给获得焦点的图形项,可以用QgraphicsScene::setFocusItem()或QGraphicsItem::setFocus()函数为图形项设置焦点。 鼠标悬停事件:进入图形项GraphicsSceneHoverEnter,鼠标移动GraphicsSceneHoverMove,离开图形项Graphics... QGraphicsItem是用于场景QGraphicsScene中在所有图形项的基类,它是一个纯虚类,不能直接使用。子类化QGraphicsItem后,需要重新实现图形项的几何形状、碰撞检测、绘画实现、事件处理。 常用图形项: