[[dnd]]
 
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
 
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 <QColorDialog>
#include <QToolButton>
#include <QPixmap>
#include <QMimeData>
#include <QDrag>
#include <QGraphicsEllipseItem>
#include <QGraphicsTextItem>
#include <QGraphicsSceneMouseEvent>
#include <QDragEnterEvent>
 
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<QColor>();
           // 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<QPixmap> ();
            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);
    }
 
}
 
dnd.txt · Last modified: 2019/03/19 15:13 by 147.32.8.110
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki