#ifndef MAINWINDOW_H #define MAINWINDOW_H #include namespace Ui { class MainWindow; } class MainWindow : public QMainWindow { Q_OBJECT public: explicit MainWindow(QWidget *parent = nullptr); ~MainWindow(); private slots: void on_action_Test_triggered(); private: Ui::MainWindow *ui; protected: void dragEnterEvent (QDragEnterEvent *event); void dropEvent (QDropEvent *event); }; #endif // MAINWINDOW_H #include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include #include #include #include #include #include #include class ColorButton : public QToolButton { private: QString name; QColor color; public: ColorButton (QString s) { name = s; color = QColor (name); setText (name); setToolTip (name); QPixmap img (32, 32); img.fill(QColor (0, 0, 0, 0)); QPainter p (&img); p.setBrush (color); p.drawEllipse (1, 1, 30, 30); setIcon (img); } void mousePressEvent(QMouseEvent *event) { QMimeData * data = new QMimeData; data->setText (name); data->setColorData(color); data->setImageData (icon ()); QDrag * drag = new QDrag(this); drag->setMimeData(data); drag->start (); } }; class Eli : public QGraphicsEllipseItem { public: Eli () { setPos (10, 220); setRect (0, 0, 190, 90); setPen (QColor ("blue")); setBrush (QColor ("yellow")); setFlags (QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); setAcceptDrops(true); QRectF r = rect (); for (int i = 1; i <= 2; i++) { QGraphicsEllipseItem * t = new QGraphicsEllipseItem; if (i == 1) t->setPos (r.width()*0.25-16, r.height()/2-16); else t->setPos (r.width()*0.75-16, r.height()/2-16); t->setRect(0, 0, 32, 32); t->setPen(QColor ("blue")); t->setBrush(QColor ("cornflowerblue")); t->setFlags (QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); t->setParentItem (this); } } void mouseDoubleClickEvent (QGraphicsSceneMouseEvent *event) { // setBrush (QColor ("orange")); QColor c0 = brush().color(); QColor c = QColorDialog::getColor(c0); if (c.isValid()) setBrush (c); } void wheelEvent(QGraphicsSceneWheelEvent *event) { int d = 10; if (event->delta() < 0 ) d = -10; QRectF r = rect (); r.adjust(0, 0, d, d); setRect(r); } void dragEnterEvent (QGraphicsSceneDragDropEvent *event) { const QMimeData * data = event->mimeData(); if (data->hasColor() || data->hasImage()) event->setAccepted(true); } void dropEvent (QGraphicsSceneDragDropEvent *event) { const QMimeData * data = event->mimeData(); if (data->hasColor()) { QColor c = data->colorData().value(); // setBrush(c); if (data->hasText()) { QString s = data->text(); QPointF p = event->scenePos(); p -= this->scenePos(); QGraphicsTextItem * item = new QGraphicsTextItem; // item->setPos(p); item->setDefaultTextColor(c); item->setPlainText (s); item->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); item->setParentItem (this); } } if (data->hasImage()) { QPixmap img = data->imageData().value (); QPointF p = event->scenePos(); p -= this->scenePos(); QGraphicsPixmapItem * item = new QGraphicsPixmapItem; // item->setPos(p); item->setPixmap (img); item->setFlags(QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); item->setParentItem (this); } } }; MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); setAcceptDrops(true); QStringList colors; colors << "red" << "blue" << "green" << "yellow"; for (QString name : colors) { ColorButton * b = new ColorButton (name); ui->mainToolBar->addWidget(b); } QGraphicsScene * scene = scene = new QGraphicsScene; ui->graphicsView->setScene (scene); scene->setSceneRect(0, 0, 800, 640); scene->addLine(10, 10, 200, 100, QColor ("red")); scene->addRect(10, 110, 190, 90, QColor ("lime"), QColor ("yellow")); } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_action_Test_triggered() { ui->graphicsView->scene()->addItem (new Eli); } void MainWindow::dragEnterEvent(QDragEnterEvent *event) { const QMimeData * data = event->mimeData(); if (data->hasText()) event->setAccepted(true); } void MainWindow::dropEvent(QDropEvent *event) { const QMimeData * data = event->mimeData(); if (data->hasText()) { QString s = data->text(); setWindowTitle (s); } }