欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Qt学习笔记-图像碰撞(变色,消失,跟随)

程序员文章站 2022-07-12 22:58:55
...
运行截图如下:
红色:圆矩形我们控制的
蓝色:圆矩形(碰撞变色)
绿色:圆形(碰撞后消失)

黑色:矩形(碰撞后跟随)

Qt学习笔记-图像碰撞(变色,消失,跟随)

Qt学习笔记-图像碰撞(变色,消失,跟随)

Qt学习笔记-图像碰撞(变色,消失,跟随)


代码如下:

graphicsitem.h

#ifndef GRAPHICSITEM_H
#define GRAPHICSITEM_H

#include <QGraphicsItem>

class GraphicsItem:public QGraphicsItem
{
public:
    GraphicsItem();
    QRectF boundingRect()const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
    void setColor(const QColor &color);

protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *event);
    void keyPressEvent(QKeyEvent *event);

private:
    QColor m_color;
};

#endif // GRAPHICSITEM_H

graphicsitem2.h

#ifndef GRAPHICSITEM2_H
#define GRAPHICSITEM2_H

#include <QGraphicsItem>


class GraphicsItem2:public QGraphicsItem
{
public:
    GraphicsItem2();
    QRectF boundingRect()const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
    void setColor(const QColor &color);
    void setMyFlag(int flag);
    int getMyFlag();

    void reflush();

    void ChangeRang();

protected:
    void mousePressEvent(QGraphicsSceneMouseEvent *event);

private:
    QColor m_color;
    int m_flag;


};

#endif // GRAPHICSITEM2_H


graphicsitem.cpp

#include "graphicsitem.h"
#include "graphicsitem2.h"
#include "graphicsflag.h"

#include <QPainter>
#include <QCursor>
#include <QKeyEvent>
#include <QGraphicsView>
#include <QDebug>
#include <typeinfo>

GraphicsItem::GraphicsItem()
{
    m_color=Qt::black;
    setFlag(QGraphicsItem::ItemIsFocusable);
    setFlag(QGraphicsItem::ItemIsMovable);
}

QRectF GraphicsItem::boundingRect()const{
    qreal penWidth=1;
    return QRectF(0-penWidth/2,0-penWidth/2,100+penWidth,100+penWidth);
}

void GraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){
    Q_UNUSED(option)
    Q_UNUSED(widget)
    painter->setBrush(m_color);
    painter->drawRoundedRect(0,0,100,100,5,5);
}

void GraphicsItem::setColor(const QColor &color){
    m_color=color;
}


void GraphicsItem::mousePressEvent(QGraphicsSceneMouseEvent *event){
    Q_UNUSED(event)
    setFocus();
    setCursor(Qt::ClosedHandCursor);
}

void GraphicsItem::keyPressEvent(QKeyEvent *event){
    if(event->key()==Qt::Key_Down)
        moveBy(0,10);
    else if(event->key()==Qt::Key_Up)
        moveBy(0,-10);
    else if(event->key()==Qt::Key_Left)
        moveBy(-10,0);
    else if(event->key()==Qt::Key_Right)
        moveBy(10,0);

    QList<QGraphicsItem*>list=collidingItems();
    if(!list.isEmpty()){
        if(QString(typeid(*(list.at(0))).name())=="13GraphicsItem2"){
            if(((GraphicsItem2 *)(list.at(0)))->getMyFlag()==1){
                ((GraphicsItem2 *)(list.at(0)))->setColor(Qt::yellow);
                ((GraphicsItem2 *)(list.at(0)))->reflush();
                ((GraphicsItem2 *)(list.at(0)))->setMyFlag(2);
            }
            else if(((GraphicsItem2 *)(list.at(0)))->getMyFlag()==2){
                ((GraphicsItem2 *)(list.at(0)))->setColor(Qt::blue);
                ((GraphicsItem2 *)(list.at(0)))->reflush();
                ((GraphicsItem2 *)(list.at(0)))->setMyFlag(1);
            }
            else if(((GraphicsItem2 *)(list.at(0)))->getMyFlag()==3){
                ((GraphicsItem2 *)(list.at(0)))->hide();
            }
            else{
                if(event->key()==Qt::Key_Down)
                    ((GraphicsItem2 *)(list.at(0)))->moveBy(0,10);
                else if(event->key()==Qt::Key_Up)
                    ((GraphicsItem2 *)(list.at(0)))->moveBy(0,-10);
                else if(event->key()==Qt::Key_Left)
                    ((GraphicsItem2 *)(list.at(0)))->moveBy(-10,0);
                else if(event->key()==Qt::Key_Right)
                    ((GraphicsItem2 *)(list.at(0)))->moveBy(10,0);
            }
        }
    }
    list.clear();

}


graphicsitem2.cpp

#include "graphicsitem2.h"

#include <QPainter>
#include <QCursor>
#include <QKeyEvent>
#include <QGraphicsView>
#include <QDebug>

GraphicsItem2::GraphicsItem2()
{
    m_color=Qt::black;
    setFlag(QGraphicsItem::ItemIsFocusable);
    setFlag(QGraphicsItem::ItemIsMovable);
}

QRectF GraphicsItem2::boundingRect()const{
    qreal penWidth=1;
    return QRectF(0,0-penWidth/2,100+penWidth,100+penWidth);
}

void GraphicsItem2::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget){
    Q_UNUSED(option)
    Q_UNUSED(widget)
    if(m_flag==1||m_flag==2){
        painter->setBrush(m_color);
        painter->drawRoundedRect(0,0,100,100,5,5);
    }
    else if(m_flag==3){
        painter->setBrush(m_color);
        painter->drawEllipse(0,0,100,100);
    }
    else{
        painter->setBrush(m_color);
        painter->drawRect(0,0,100,100);
    }
}

void GraphicsItem2::setColor(const QColor &color){
    m_color=color;
}

void GraphicsItem2::setMyFlag(int flag)
{
    m_flag=flag;
}

int GraphicsItem2::getMyFlag()
{
    return m_flag;
}

void GraphicsItem2::reflush()
{
    this->update();
}

void GraphicsItem2::ChangeRang()
{

    prepareGeometryChange();
}


void GraphicsItem2::mousePressEvent(QGraphicsSceneMouseEvent *event){
    Q_UNUSED(event)
    setFocus();
    setCursor(Qt::ClosedHandCursor);
}


main.cpp

#include <QApplication>
#include <QDebug>
#include "graphicsitem.h"
#include "graphicsitem2.h"

#include <QGraphicsScene>
#include <QGraphicsRectItem>
#include <QGraphicsView>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    QGraphicsScene scene;
    GraphicsItem *item=new GraphicsItem;
    GraphicsItem2 *item2=new GraphicsItem2;
    scene.addItem(item);
    scene.addItem(item2);
    item->setPos(150,150);
    item2->setMyFlag(1);
    item->setColor(Qt::red);
    item2->setPos(0,0);
    item2->setColor(Qt::blue);

    GraphicsItem2 *item3=new GraphicsItem2;
    scene.addItem(item3);
    item3->setPos(-100,-100);
    item3->setMyFlag(3);
    item3->setColor(Qt::green);

    GraphicsItem2 *item4=new GraphicsItem2;
    scene.addItem(item4);
    item4->setPos(150,400);
    item4->setMyFlag(4);
    item4->setColor(Qt::black);

    scene.setSceneRect(0,0,700,500);
    QGraphicsView view(&scene);
    view.setWindowTitle("CSDN IT1995");

    view.resize(700,500);
    view.show();

    return a.exec();
}



相关标签: Qt C++ 碰撞