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后,需要重新实现图形项的几何形状、碰撞检测、绘画实现、事件处理。
常用图形项: