Qt学习笔记-图像碰撞(变色,消失,跟随)
程序员文章站
2022-07-12 22:58:55
...
运行截图如下:
红色:圆矩形我们控制的
蓝色:圆矩形(碰撞变色)
绿色:圆形(碰撞后消失)
红色:圆矩形我们控制的
蓝色:圆矩形(碰撞变色)
绿色:圆形(碰撞后消失)
黑色:矩形(碰撞后跟随)
代码如下:
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();
}