#include "mainwindow.h"
#include "ui_mainwindow.h"
 
#include <QGraphicsRectItem>
#include <QGraphicsEllipseItem>
 
#include <QDrag>
#include <QMimeData>
#include <QGraphicsSceneDragDropEvent>
 
#include <QPixmap>
#include <QPainter>
 
QPixmap * image ()
{
    QPixmap * p = new QPixmap (24, 24);
    p->fill (Qt::transparent);
 
    QPainter m (p);
    m.setPen (QColor ("blue"));
    m.setBrush (QColor ("orange"));
    m.drawEllipse (2, 2, 20, 20);
 
    return p;
}
QIcon icon ()
{
    QPixmap * p = image ();
    QIcon i (*p);
    return i;
}
 
class Shape : public QGraphicsEllipseItem
{
public:
    Shape ();
 
protected:
    virtual void dragEnterEvent (QGraphicsSceneDragDropEvent *event) override;
    virtual void dropEvent (QGraphicsSceneDragDropEvent *event) override;
};
 
Shape::Shape ()
{
    setRect (0, 0, 100, 50);
    setPos (-50, -50);
    setPen (QColor ("blue"));
    setBrush (QColor ("yellow"));
    setFlags (QGraphicsItem::ItemIsMovable |
              QGraphicsItem::ItemIsSelectable);
    setAcceptDrops (true);
}
 
void Shape::dragEnterEvent (QGraphicsSceneDragDropEvent *event)
{
    const QMimeData * data = event->mimeData();
    if (data->hasText() || data->hasColor())
        event->setAccepted (true);
}
 
#include <QGraphicsTextItem>
void Shape::dropEvent(QGraphicsSceneDragDropEvent *event)
{
    const QMimeData * data = event->mimeData();
    if (data->hasColor())
    {
        QColor c = qvariant_cast <QColor> (data->colorData());
        if (event->modifiers() == Qt::ControlModifier)
            setPen (c);
        else
            setBrush (c);
    }
    if (data->hasText())
    {
        QString s = data->text();
        QGraphicsTextItem * item = new QGraphicsTextItem;
        item->setDefaultTextColor (QColor ("lime"));
        item->setFont (QFont ("", 20));
        item->setPlainText (s);
        item->setFlags(QGraphicsItem::ItemIsMovable);
        item->setParentItem (this);
    }
}
 
void MainWindow::on_toolButton_pressed()
{
    QMimeData * data = new QMimeData;
    data->setText ("Hello");
    data->setColorData (QColor ("orange"));
 
    QDrag * drag = new QDrag (this);
    drag->setMimeData (data);
    drag->setPixmap( * image () );
    drag->start ();
}
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    ui->toolButton->setIcon (icon ());
 
    QGraphicsScene * scene = new QGraphicsScene;
    ui->graphicsView->setScene (scene);
    scene->addLine (0, 0, 100, 100, QColor ("red"));
    scene->addItem (new Shape);
 
    for (int i = 1; i <= 3; i++)
    {
        QGraphicsRectItem * r = new QGraphicsRectItem;
        r->setPos (10+10*i, 10+10*i);
        r->setRect (0, 0, 50, 50);
        QColor c = QColor::fromHsv (60*i, 255, 255);
        r->setPen (QColor ("blue"));
        r->setBrush (c);
        r->setFlags (QGraphicsItem::ItemIsMovable |
                     QGraphicsItem::ItemIsSelectable);
        scene->addItem (r);
 
        for (int j = 1; j <= 2; j++)
        {
            QGraphicsEllipseItem * e = new QGraphicsEllipseItem;
            e->setPos (10+20*(j-1), 10);
            e->setRect (0, 0, 10, 10);
            e->setPen (QColor ("blue"));
            e->setBrush (QColor ("blue").light());
            e->setParentItem (r);
        }
    }
 
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
drag_and_drop.txt · Last modified: 2018/03/26 17:05 by 147.32.8.115
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki