#include "mainwindow.h" #include "ui_mainwindow.h" #include #include #include #include #include #include #include /* ---------------------------------------------------------------------- */ void dragEnter (QGraphicsSceneDragDropEvent *event) { const QMimeData * data = event->mimeData(); if (data->hasText() || data->hasColor()) event->setAccepted(true); } void drop (QGraphicsSceneDragDropEvent *event, QAbstractGraphicsShapeItem * target) { const QMimeData * data = event->mimeData(); if (data->hasColor()) { QColor c = qvariant_cast ( data->colorData() ); Qt::DropAction action = event->proposedAction(); if (action == Qt::MoveAction) target->setPen (c); else target->setBrush (c); } if (data->hasText()) { QString s = data->text (); QGraphicsTextItem * item = new QGraphicsTextItem; item->setDefaultTextColor(QColor ("lime")); item->setFont (QFont ("Sans Serif", 20)); item->setPlainText (s); item->setFlags (QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); item->setParentItem (target); } } /* ---------------------------------------------------------------------- */ void Ellipse::dragEnterEvent (QGraphicsSceneDragDropEvent *event) { dragEnter (event); } void Ellipse::dropEvent (QGraphicsSceneDragDropEvent *event) { drop (event, this); } void Ellipse::readXmlShape (QXmlStreamReader & r) { int x = 0; int y = 0; int w = 40; int h = 40; QColor p = QColor ("blue"); QColor b = QColor ("orange"); QXmlStreamAttributes a = r.attributes(); if (a.hasAttribute("x")) x = a.value("x").toInt(); if (a.hasAttribute("y")) y = a.value("y").toInt(); if (a.hasAttribute("w")) w = a.value("w").toInt(); if (a.hasAttribute("h")) h = a.value("h").toInt(); if (a.hasAttribute("pen")) p = QColor (a.value("pen").toString()); if (a.hasAttribute("brush")) b = QColor (a.value("brush").toString()); setRect (x, y, w, h); setPen (p); setBrush (b); } void Ellipse::writeXmlShape (QXmlStreamWriter & w) { w.writeAttribute ("x", QString::number (this->x())); w.writeAttribute ("y", QString::number (this->y())); w.writeAttribute ("tooltip", this->toolTip()); w.writeAttribute("w", QString::number (this->boundingRect().width())); w.writeAttribute("h", QString::number (this->boundingRect().height())); w.writeAttribute("pen", this->pen().color().name()); w.writeAttribute("brush", this->brush().color().name()); } Ellipse::Ellipse () { setAcceptDrops (true); /* // QLinearGradient d (0, 0, 200, 100); QRadialGradient d (100, 100, 100, 100, 50); d.setColorAt(0.0, QColor ("yellow")); d.setColorAt (1.0, QColor ("blue")); QBrush b (d); setBrush (b); */ setBrush (QColor ("yellow")); setRect (0, 0, 200, 100); setFlags (QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); } /* ---------------------------------------------------------------------- */ void Rectangle::dragEnterEvent (QGraphicsSceneDragDropEvent *event) { dragEnter (event); } void Rectangle::dropEvent (QGraphicsSceneDragDropEvent *event) { drop (event, this); } void Rectangle::readXmlShape (QXmlStreamReader & r) { int x = 0; int y = 0; int w = 40; int h = 40; QColor p = QColor ("blue"); QColor b = QColor ("orange"); QXmlStreamAttributes a = r.attributes(); if (a.hasAttribute("x")) x = a.value("x").toInt(); if (a.hasAttribute("y")) y = a.value("y").toInt(); if (a.hasAttribute("w")) w = a.value("w").toInt(); if (a.hasAttribute("h")) h = a.value("h").toInt(); if (a.hasAttribute("pen")) p = QColor (a.value("pen").toString()); if (a.hasAttribute("brush")) b = QColor (a.value("brush").toString()); setRect (x, y, w, h); setPen (p); setBrush (b); } void Rectangle::writeXmlShape (QXmlStreamWriter & w) { w.writeAttribute ("x", QString::number (this->x())); w.writeAttribute ("y", QString::number (this->y())); w.writeAttribute ("tooltip", this->toolTip()); w.writeAttribute("w", QString::number (this->boundingRect().width())); w.writeAttribute("h", QString::number (this->boundingRect().height())); w.writeAttribute("pen", this->pen().color().name()); w.writeAttribute("brush", this->brush().color().name()); } Rectangle::Rectangle () { setAcceptDrops (true); setBrush (QColor ("yellow")); setRect (0, 0, 100, 100); setFlags (QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); } /* ---------------------------------------------------------------------- */ QPixmap image (int size, QColor color) { QPixmap p (size, size); p.fill (Qt::transparent); QPainter t (&p); t.setPen (color); t.setBrush (color); t.drawEllipse (1, 1, size-2, size-2); return p; } QIcon mark (QColor color) { return QIcon (image (32, color)); } ColorButton::ColorButton (QColor c) : color (c) { setIcon (mark (color)); } void ColorButton::mousePressEvent(QMouseEvent *event) { QMimeData * data = new QMimeData; data->setColorData (color); QDrag * drag = new QDrag (this); drag->setPixmap (image (16, color)); drag->setHotSpot (QPoint (10, 10)); drag->setMimeData(data); drag->start (Qt::CopyAction | Qt::MoveAction | Qt::LinkAction); } /* ---------------------------------------------------------------------- */ MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QStringList names; names << "red" << "green" << "blue" << "yellow" << "orange"; int x = 0; for (QString name : names) { QColor color (name); ColorButton * b = new ColorButton (color); b->setToolTip (name); b->setParent (ui->colorTab); b->move (x, 0); x += 36; } QGraphicsScene * scene = new QGraphicsScene; ui->graphicsView->setScene (scene); scene->addLine (0, 0, 100, 100, QColor ("red")); scene->addItem (new Ellipse); for (int i = 1; i <= 3; i++) { QGraphicsRectItem * r = new QGraphicsRectItem; r->setRect (0, 0, 40, 40); r->setPos (40 + 10*i, 40+10*i); r->setPen (QColor ("blue")); r->setBrush(QColor::fromHsv (60*i, 255, 255)); r->setToolTip ("Muj obdelnik " + QString::number (i)); r->setFlags (QGraphicsItem::ItemIsMovable | QGraphicsItem::ItemIsSelectable); scene->addItem (r); } } MainWindow::~MainWindow() { delete ui; } void MainWindow::on_action_Quit_triggered() { close (); } /* ---------------------------------------------------------------------- */ void MainWindow::on_action_Run_triggered() { QGraphicsScene * scene = ui->graphicsView->scene(); ui->treeWidget->clear(); for (QGraphicsItem * item : scene->items ()) { QString s = QString::number (item->x()) + "," + QString::number (item->y()) + ": " + item->toolTip(); TreeItem * node = new TreeItem; node->obj = item; node->setText (0, s); ui->treeWidget->addTopLevelItem (node); } } void MainWindow::showText (int line, QString name, QString value) { QTableWidgetItem * a = new QTableWidgetItem; a->setText (name); ui->tableWidget->setItem (line, 0, a); QTableWidgetItem * b = new QTableWidgetItem; b->setText (value); ui->tableWidget->setItem (line, 1, b); } void MainWindow::showNumber (int line, QString name, int value) { QTableWidgetItem * a = new QTableWidgetItem; a->setText (name); ui->tableWidget->setItem (line, 0, a); QTableWidgetItem * b = new QTableWidgetItem; b->setData (Qt::EditRole, value); ui->tableWidget->setItem (line, 1, b); } void MainWindow::showColor (int line, QString name, QColor value) { QTableWidgetItem * a = new QTableWidgetItem; a->setText (name); ui->tableWidget->setItem (line, 0, a); QTableWidgetItem * b = new QTableWidgetItem; b->setText (value.name()); b->setData (Qt::DecorationRole, value); ui->tableWidget->setItem (line, 1, b); } void MainWindow::on_treeWidget_itemClicked(QTreeWidgetItem *item, int column) { TreeItem * node = dynamic_cast (item); if (node != nullptr) { ui->graphicsView->scene()->clearSelection(); node->obj->setSelected (true); ui->statusBar->showMessage ("item selected: " + node->obj->toolTip()); ui->tableWidget->clearContents(); ui->tableWidget->setColumnCount(2); ui->tableWidget->setRowCount(5); int x = node->obj->x(); int y = node->obj->y(); showNumber (0, "x", x); showNumber (1, "y", y); showText (2, "tooltip", node->obj->toolTip()); QAbstractGraphicsShapeItem * p = dynamic_cast (node->obj); if (p != nullptr) { showColor (3, "pen", p->pen().color()); showColor (4, "brush", p->brush().color()); } } } /* ---------------------------------------------------------------------- */ void MainWindow::readXml (QXmlStreamReader & r) { QGraphicsItem * target = nullptr; while (!r.atEnd()) { r.readNext (); if (r.isStartElement()) { QString name = r.name().toString(); QGraphicsItem * item = nullptr; if (name == "image") { } else if (name == "ellipse") { Ellipse * e = new Ellipse; e->readXmlShape (r); item = e; } else if (name == "rectangle") { Rectangle * e = new Rectangle; e->readXmlShape (r); item = e; } if (item != nullptr) { if (target == NULL) ui->graphicsView->scene()->addItem (item); else item->setParentItem(target); target = item; } } else if (r.isStartElement()) { if (target != nullptr) target = target->parentItem(); } } } void MainWindow::writeXml (QXmlStreamWriter & w) { w.setAutoFormatting(true); w.writeStartDocument(); w.writeStartElement("image"); QGraphicsScene * scene = ui->graphicsView->scene(); for (QGraphicsItem * item : scene->items ()) { QString name = "item"; Ellipse * e = dynamic_cast (item); Rectangle * f = dynamic_cast (item); QGraphicsRectItem * r = dynamic_cast (item); QGraphicsLineItem * c = dynamic_cast (item); QGraphicsTextItem * t = dynamic_cast (item); if (e != nullptr) name = "ellipse"; if (f != nullptr) name = "rectangle"; if (r != nullptr) name = "rectangle"; if (c != nullptr) name = "line"; if (t != nullptr) name = "text"; QAbstractGraphicsShapeItem * s = dynamic_cast (item); w.writeStartElement(name); if (e != nullptr) e->writeXmlShape(w); else if (f != nullptr) f->writeXmlShape(w); else { w.writeAttribute("x", QString::number (item->x())); w.writeAttribute("y", QString::number (item->y())); w.writeAttribute("tooltip", item->toolTip()); if (s != nullptr) { w.writeAttribute("w", QString::number (s->boundingRect().width())); w.writeAttribute("h", QString::number (s->boundingRect().height())); w.writeAttribute("pen", s->pen().color().name()); w.writeAttribute("brush", s->brush().color().name()); } if (c != nullptr) { w.writeAttribute("x2", QString::number (c->line().x2())); w.writeAttribute("y2", QString::number (c->line().y2())); w.writeAttribute("pen", c->pen().color().name()); } if (t != nullptr) { w.writeAttribute("text", t->toPlainText()); w.writeAttribute("color", t->defaultTextColor().name()); } } w.writeEndElement(); } w.writeEndElement(); w.writeEndDocument(); } void MainWindow::on_actionOpen_triggered() { QString fileName = QFileDialog::getOpenFileName (this, "Open image data"); if (fileName != "") { QFile f (fileName); if (f.open (QFile::ReadOnly | QFile::Text)) { QXmlStreamReader r (&f); readXml (r); f.close (); } } } void MainWindow::on_actionSave_triggered() { QString fileName = QFileDialog::getSaveFileName(this, "Save image data"); if (fileName != "") { ui->statusBar->showMessage ("Save to " + fileName); QFile f (fileName); if (f.open (QFile::WriteOnly | QFile::Text)) { QXmlStreamWriter w (&f); writeXml (w); f.close (); } } } /* ---------------------------------------------------------------------- */ int main(int argc, char *argv[]) { QApplication a(argc, argv); MainWindow w; w.show(); return a.exec(); }