#include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include #include #include #include #include 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 void Shape::dropEvent(QGraphicsSceneDragDropEvent *event) { const QMimeData * data = event->mimeData(); if (data->hasColor()) { QColor c = qvariant_cast (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; }