Qt模仿游戏拖装备(换装备)

程序运行截图如下:
这里写图片描述

代码如下:
mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

class MyGraphicsScene;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    enum type{HEAD,CHEST,LEFTHAND,RIGHTHAND,FOOT};
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

    void timerEvent(QTimerEvent *event);

protected:
    void initGraphicsItem();

private:
    Ui::MainWindow *ui;
    MyGraphicsScene *m_scene;

    int m_timer_z;
};

#endif // MAINWINDOW_H

mygraphicsitem.h

#ifndef MYGRAPHICSITEM_H
#define MYGRAPHICSITEM_H

#include <QGraphicsItem>
#include <QString>
#include <QObject>

class MyGraphicsItem;

class MyGraphicsItem : public QObject,public QGraphicsItem
{
    Q_OBJECT
public:
    MyGraphicsItem();
    ~MyGraphicsItem();
    QRectF boundingRect()const;
    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);

    bool startDetection(int &gracType);
    void timerEvent(QTimerEvent *event);


    QString remindText;
    QString imageStr;
    int graphicsType;
};

#endif // MYGRAPHICSITEM_H

mygraphicsview.h

#ifndef MYGRAPHICSVIEW_H
#define MYGRAPHICSVIEW_H

#include <QObject>
#include <QGraphicsView>

#define HEADTYPE 0
#define CHESTTYPE 1
#define LEFTHANDTYPE 2
#define RIGHTHANDTYPE 3
#define FOOTTYPE 4

class MyGraphicsItem;


class MyGraphicsView : public QGraphicsView
{
    Q_OBJECT
public:
    MyGraphicsView(QWidget *parent=0);
    ~MyGraphicsView();
    bool isInEquipment(QDropEvent *event, int &graType);


protected:

    void dragEnterEvent(QDragEnterEvent *event);
    void dropEvent(QDropEvent *event);

    void estimateHeadText(MyGraphicsItem *item,const QString &text);
    void estimateChestText(MyGraphicsItem *item,const QString &text);
    void estimateLeftHandText(MyGraphicsItem *item,const QString &text);
    void estimateRightHandText(MyGraphicsItem *item,const QString &text);
    void estimateFootText(MyGraphicsItem *item, const QString &text);
    QGraphicsItem *findItem(const int type);

    void contextMenuEvent(QContextMenuEvent *event);

protected slots:
    void onDischargeAction();

private:
    MyGraphicsItem *m_contextMenuItem;

};

#endif // MYGRAPHICSVIEW_H

mygraphicsscene.h

#ifndef MYGRAPHICSSCENC_H
#define MYGRAPHICSSCENC_H

#include <QObject>
#include <QGraphicsScene>


class MyGraphicsScene : public QGraphicsScene
{
    Q_OBJECT
public:
    MyGraphicsScene(QObject *parent=0);
    ~MyGraphicsScene();

protected:
    void dragEnterEvent(QGraphicsSceneDragDropEvent *event);
    void dropEvent(QGraphicsSceneDragDropEvent* event);
    void dragMoveEvent(QGraphicsSceneDragDropEvent *event);


};

#endif // MYGRAPHICSSCENC_H

mylistwidget.h

#ifndef MYLISTWIDGET_H
#define MYLISTWIDGET_H

#include <QObject>
#include <QListWidget>

class MyListWidget : public QListWidget
{
    Q_OBJECT
public:
    MyListWidget(QWidget *parent=0);
    ~MyListWidget();

protected:
    void mouseMoveEvent(QMouseEvent *event);
    void mousePressEvent(QMouseEvent *event);

private:
    QPoint m_dragPosition; // 拖放起点
    QListWidgetItem *m_dragItem; // 被拖放的item

};

#endif // MYLISTWIDGET_H

main.cpp

#include "mainwindow.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    MainWindow w;
    w.show();

    return a.exec();
}

mainwindow.cpp

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QGraphicsScene>
#include "mygraphicsscene.h"
#include <QGraphicsLineItem>
#include <QTimerEvent>
#include "mygraphicsitem.h"
#include <QDebug>
#include <QGraphicsDropShadowEffect>
#include <QRadialGradient>
#include <QRect>
#include <QPixmap>
#include <QDesktopWidget>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    QStringList strList;
    strList.append("裁决");
    strList.append("游龙剑");
    strList.append("祈祷之刃");
    ui->mylistWidget->insertItems(0,strList);
    m_scene=new MyGraphicsScene;
    QRect sceenRect=QApplication::desktop()->screenGeometry();
    setFixedSize(sceenRect.width()/1.2,sceenRect.height()/1.2);

    initGraphicsItem();
    m_scene->setSceneRect(-200.5,-100.5,501,501);
    ui->graphicsView->setScene(m_scene);
    m_timer_z=0;
    startTimer(10);

    connect(ui->pushButton,SIGNAL(clicked(bool)),this,SLOT(close()));

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::timerEvent(QTimerEvent *event)
{
    if(m_timer_z==180)
        m_timer_z=0;
    QRadialGradient gradient(50,150,m_timer_z++);
    gradient.setSpread(QGradient::RepeatSpread);
    m_scene->setBackgroundBrush(gradient);
}

void MainWindow::initGraphicsItem()
{
    QGraphicsDropShadowEffect  *headShadowE=new QGraphicsDropShadowEffect;
    headShadowE->setOffset(10,10);

    QGraphicsDropShadowEffect  *bodyShadowE=new QGraphicsDropShadowEffect;
    headShadowE->setOffset(10,10);

    QGraphicsDropShadowEffect  *footShadowE=new QGraphicsDropShadowEffect;
    headShadowE->setOffset(10,10);

    QGraphicsDropShadowEffect  *leftHandShadowE=new QGraphicsDropShadowEffect;
    headShadowE->setOffset(10,10);

    QGraphicsDropShadowEffect  *rightHandShadowE=new QGraphicsDropShadowEffect;
    headShadowE->setOffset(10,10);


    MyGraphicsItem *head=new MyGraphicsItem;
    head->remindText="头盔";
    head->setPos(0,-100);
    head->graphicsType=HEAD;
    head->setGraphicsEffect(headShadowE);
    m_scene->addItem(head);

    MyGraphicsItem *body=new MyGraphicsItem;
    body->remindText="护甲";
    body->setPos(0,100);
    body->graphicsType=CHEST;
    body->setGraphicsEffect(bodyShadowE);
    m_scene->addItem(body);

    MyGraphicsItem *foot=new MyGraphicsItem;
    foot->remindText="护脚";
    foot->setPos(0,300);
    foot->graphicsType=FOOT;
    foot->setGraphicsEffect(footShadowE);
    m_scene->addItem(foot);

    MyGraphicsItem *leftHand=new MyGraphicsItem;
    leftHand->remindText="武器";
    leftHand->setPos(-200,100);
    leftHand->graphicsType=LEFTHAND;
    leftHand->setGraphicsEffect(leftHandShadowE);
    m_scene->addItem(leftHand);

    MyGraphicsItem *rightHand=new MyGraphicsItem;
    rightHand->remindText="武器";
    rightHand->setPos(200,100);
    rightHand->graphicsType=RIGHTHAND;
    rightHand->setGraphicsEffect(rightHandShadowE);
    m_scene->addItem(rightHand);
}

mygraphicsitem.cpp

#include "mygraphicsitem.h"
#include <QDebug>
#include <QRectF>
#include <QPen>
#include <QImage>
#include <QList>
#include <QBrush>
#include <QPainter>


MyGraphicsItem::MyGraphicsItem()
{
    remindText="";
    imageStr="";
    graphicsType=-1;
}

MyGraphicsItem::~MyGraphicsItem()
{

}

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

void MyGraphicsItem::paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget)
{
    Q_UNUSED(option)
    Q_UNUSED(widget)
    painter->setBrush(Qt::white);
    painter->drawRect(0,0,100,100);
    if(!imageStr.isEmpty()){
        painter->drawImage(0,0,QImage(imageStr).scaled(100,100));
    }
    else{
        painter->drawText(40,50,remindText);
    }
}

bool MyGraphicsItem::startDetection(int &gracType)
{
    QList<QGraphicsItem*> list=collidingItems();
    if(!list.isEmpty()){
        gracType=((MyGraphicsItem*)list[0])->graphicsType;
        return true;
    }
    return false;
}

void MyGraphicsItem::timerEvent(QTimerEvent *event)
{
    Q_UNUSED(event)
}

mygraphicsscene.cpp

#include "mygraphicsscene.h"
#include <QGraphicsSceneDragDropEvent>
#include <QMimeData>


MyGraphicsScene::MyGraphicsScene(QObject *parent):
    QGraphicsScene(parent)
{

}

MyGraphicsScene::~MyGraphicsScene()
{

}

void MyGraphicsScene::dragEnterEvent(QGraphicsSceneDragDropEvent *event)
{
    if(event->mimeData()->hasFormat("text/plain")){
        event->acceptProposedAction();
    }
}

void MyGraphicsScene::dropEvent(QGraphicsSceneDragDropEvent *event)
{
    QGraphicsScene::dropEvent(event);
}

void MyGraphicsScene::dragMoveEvent(QGraphicsSceneDragDropEvent *event)
{
    event->accept();
}

mygraphicsview.cpp

#include "mygraphicsview.h"
#include <QMouseEvent>
#include <QDragEnterEvent>
#include <QMimeData>
#include <QPolygonF>
#include <QPointF>
#include <QGraphicsItem>
#include <QTransform>
#include <QDebug>
#include <QMenu>
#include "mygraphicsitem.h"

MyGraphicsView::MyGraphicsView(QWidget *parent):
    QGraphicsView(parent)
{

}

MyGraphicsView::~MyGraphicsView()
{

}

bool MyGraphicsView::isInEquipment(QDropEvent *event,int &graType)
{
    MyGraphicsItem *tempItem=new MyGraphicsItem;
    tempItem->setPos(mapToScene(event->pos()));
    scene()->addItem(tempItem);
    if(tempItem->startDetection(graType)){
        delete tempItem;
        return true;
    }
    delete tempItem;
    return false;
}

void MyGraphicsView::dragEnterEvent(QDragEnterEvent *event)
{
    if(event->mimeData()->hasFormat("text/plain")){
        event->acceptProposedAction();
    }
    QGraphicsView::dragEnterEvent(event);
}

void MyGraphicsView::dropEvent(QDropEvent *event)
{
    if(event->mimeData()->hasFormat("text/plain")){
        int graphicType;


        if(isInEquipment(event,graphicType)){
            QString text=event->mimeData()->text();
            MyGraphicsItem *item=(MyGraphicsItem*)findItem(graphicType);
            switch(graphicType){
            case HEADTYPE:
                break;
            case CHESTTYPE:
                break;
            case LEFTHANDTYPE:
                estimateLeftHandText(item,text);
                break;
            case RIGHTHANDTYPE:
                estimateRightHandText(item,text);
                break;
            case FOOTTYPE:
                break;
            default:
                break;
            }
        }

        QGraphicsView::dropEvent(event);
    }
}

void estimateHeadText(MyGraphicsItem *item,const QString &text)
{
    qDebug()<<text;
}

void MyGraphicsView::estimateChestText(MyGraphicsItem *item,const QString &text)
{
    qDebug()<<text;
}

void MyGraphicsView::estimateLeftHandText(MyGraphicsItem *item,const QString &text)
{
    if(text=="裁决"){
        item->imageStr=":/img/sword_1.png";
        item->update();
    }
    else if(text=="游龙剑"){
        item->imageStr=":/img/sword_2.png";
        item->update();
    }
    else if(text=="祈祷之刃"){
        item->imageStr=":/img/sword_3.png";
        item->update();
    }
    return;
}

void MyGraphicsView::estimateRightHandText(MyGraphicsItem *item,const QString &text)
{
    if(text=="裁决"){
        item->imageStr=":/img/sword_1.png";
        item->update();
    }
    else if(text=="游龙剑"){
        item->imageStr=":/img/sword_2.png";
        item->update();
    }
    else if(text=="祈祷之刃"){
        item->imageStr=":/img/sword_3.png";
        item->update();
    }
    return;
}

void MyGraphicsView::estimateFootText(MyGraphicsItem *item,const QString &text)
{
    qDebug()<<text;
}

QGraphicsItem *MyGraphicsView::findItem(const int type)
{
    QList<QGraphicsItem*> list=scene()->items();
    for(int i=0;i<list.size();i++){
        if(((MyGraphicsItem*)list[i])->graphicsType==type){
            return list[i];
        }
    }
}

void MyGraphicsView::contextMenuEvent(QContextMenuEvent *event)
{
    QGraphicsScene *scenpt=scene();
    QTransform transtrom;
    m_contextMenuItem=(MyGraphicsItem*)(scenpt->itemAt(mapToScene(event->pos()),transtrom));
    if(m_contextMenuItem==NULL||m_contextMenuItem->imageStr.isEmpty())
        return;

    QMenu menu;
    menu.addAction("卸下",this,&MyGraphicsView::onDischargeAction);
    menu.exec(event->globalPos());

}

void MyGraphicsView::onDischargeAction()
{
    m_contextMenuItem->imageStr="";
    m_contextMenuItem->update();
}

mylistwidget.cpp

#include "mylistwidget.h"
#include <QDebug>
#include <QDrag>
#include <QMouseEvent>
#include <QMimeData>
#include <QPixmap>
#include <QPainter>
#include <QApplication>


MyListWidget::MyListWidget(QWidget *parent):
    QListWidget(parent)
{

}

MyListWidget::~MyListWidget()
{

}

void MyListWidget::mouseMoveEvent(QMouseEvent *event)
{
    if(!(event->buttons()&Qt::LeftButton))
        return;
    if((event->pos()-m_dragPosition).manhattanLength()<QApplication::startDragDistance())
        return;

    if(!m_dragItem)
        return;

    QDrag *drag=new QDrag(this);
    QMimeData *mimeData=new QMimeData;
    mimeData->setText(currentItem()->text());
    drag->setMimeData(mimeData);

    if(mimeData->text()=="裁决"){
        QPixmap dragImg(":/img/sword_1.png");
        drag->setPixmap(dragImg.scaled(100,100));
    }
    else if(mimeData->text()=="游龙剑"){
        QPixmap dragImg(":/img/sword_2.png");
        drag->setPixmap(dragImg.scaled(100,100));
    }
    else if(mimeData->text()=="祈祷之刃"){
            QPixmap dragImg(":/img/sword_3.png");
            drag->setPixmap(dragImg.scaled(100,100));
    }
    else{

    }
    drag->exec(Qt::CopyAction|Qt::MoveAction);


}

void MyListWidget::mousePressEvent(QMouseEvent *event)
{
    m_dragPosition=event->pos();
    m_dragItem=this->itemAt(event->pos());
    QListWidget::mousePressEvent(event);
}

猜你喜欢

转载自blog.csdn.net/qq78442761/article/details/81114383