Qt工作笔记-ListWidget拖动(拖拽)到QGraphicsScene

程序运行截图如下:



程序很简单,有个坑,如下:

QGraphicsScene要经过

dragMoveEvent(QGraphicsSceneDragDropEvent *event)

才能触发这个

dropEvent(QGraphicsSceneDragDropEvent *event)


程序结构如下:



源代码如下:

mygraphicsscene.h

#ifndef MYGRAPHICSSCENE_H
#define MYGRAPHICSSCENE_H

#include <QObject>
#include <QGraphicsView>
class MyGraphicsScene : public QGraphicsScene
{
    Q_OBJECT
public:
    MyGraphicsScene(QWidget *parent=0);
    ~MyGraphicsScene();

    void createRect(const QPointF &pt);
    void createLine(const QPointF &pt);

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

private:
    QGraphicsScene *m_scene;
};

#endif // MYGRAPHICSSCENE_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


widget.h

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

class MyGraphicsScene;

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

private:
    Ui::Widget *ui;
    MyGraphicsScene *m_scene;
};

#endif // WIDGET_H


main.cpp

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

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

    return a.exec();
}


mygraphicsscene.cpp

#include "mygraphicsscene.h"
#include <QDebug>
#include <QMimeData>
#include <QGraphicsSceneDragDropEvent>
#include <QGraphicsLineItem>
#include <QGraphicsRectItem>
#include <QGraphicsScene>
#include <QPen>


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

}

MyGraphicsScene::~MyGraphicsScene()
{

}

void MyGraphicsScene::createRect(const QPointF &pt)
{
    QGraphicsRectItem *item=new QGraphicsRectItem;
    item->setRect(pt.x(),pt.y(),18,50);
    item->setBrush(QBrush(Qt::red));
    item->setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable);
    this->addItem(item);
}

void MyGraphicsScene::createLine(const QPointF &pt)
{
    QGraphicsLineItem *item=new QGraphicsLineItem;
    item->setLine(pt.x(),pt.y(),pt.x(),pt.y()+56);
    item->setPen(QPen(Qt::red,5));
    item->setFlags(QGraphicsItem::ItemIsSelectable|QGraphicsItem::ItemIsMovable);
    this->addItem(item);
}

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

void MyGraphicsScene::dropEvent(QGraphicsSceneDragDropEvent *event)
{
    if (event->mimeData()->hasFormat("text/plain"))
    {
        QString text=event->mimeData()->text();
        if(text=="矩形"){
            createRect(event->scenePos());
        }
        else if(text=="直线"){
            createLine(event->scenePos());
        }
        else{

        }
        event->acceptProposedAction();
    }
}

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


mylistwidget.cpp

#include "mylistwidget.h"

#include <QMouseEvent>
#include <QListWidgetItem>
#include <QDrag>
#include <QApplication>
#include <QMimeData>
#include <QPainter>
#include <QPixmap>

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(18,50);
        QPainter painter(&dragImg);
        painter.setBrush(QBrush(Qt::red));
        painter.drawRect(0,0,18,50);
        drag->setPixmap(dragImg);
    }
    else if(mimeData->text()=="直线"){
        QPixmap dragImg(2,56);
        QPainter painter(&dragImg);
        painter.setPen(QPen(Qt::red,2));
        painter.drawLine(0,0,0,56);
        drag->setPixmap(dragImg);
    }
    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);
}


widget.cpp

#include "widget.h"
#include "ui_widget.h"
#include "mygraphicsscene.h"

Widget::Widget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::Widget)
{
    ui->setupUi(this);

    this->setWindowTitle("CSDN IT1995");

    QStringList strList;
    strList.append("矩形");
    strList.append("直线");
    ui->listWidget->insertItems(0,strList);
    ui->listWidget->setDragEnabled(true);

    m_scene=new MyGraphicsScene;
    m_scene->setSceneRect(0,0,ui->graphicsView->width(),ui->graphicsView->height());
    ui->graphicsView->setScene(m_scene);

}

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



猜你喜欢

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