#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);
}
}