http://kmlinux.fjfi.cvut.cz/~culikzde/sos/graphics03.tgz
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
#include
#include
#include
#include
QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE
class MainWindow : public QMainWindow
{
Q_OBJECT
public:
MainWindow(QWidget *parent = nullptr);
~MainWindow();
void openFile (QString fileName);
void refreshTree ();
QTableWidgetItem * addTableLine (QString name, QString value);
void addColorLine (QString name, QColor value);
void refreshTable (QGraphicsItem *item);
private slots:
void on_action_Open_triggered();
void on_action_Save_triggered();
void on_action_Run_triggered();
void on_action_Quit_triggered();
void on_tree_itemDoubleClicked(QTreeWidgetItem *item, int column);
private:
Ui::MainWindow * ui;
QGraphicsScene * scene;
};
class TreeNode : public QTreeWidgetItem
{
public:
QGraphicsItem * item;
TreeNode () : item (nullptr) { }
};
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
#include
#include
#include
MainWindow::MainWindow(QWidget *parent)
: QMainWindow(parent)
, ui(new Ui::MainWindow)
{
ui->setupUi(this);
ui->splitter->setStretchFactor(0, 1);
ui->splitter->setStretchFactor(1, 4);
ui->splitter->setStretchFactor(2, 1);
ui->splitter_2->setStretchFactor(0, 3);
ui->splitter_2->setStretchFactor(1, 1);
scene = new QGraphicsScene;
ui->graphicsView->setScene (scene);
scene->setSceneRect(0, 0, 800, 600);
// scene->addLine(0, 0, 100, 200, QColor ("red"));
openFile ("../pokus/abc.xml");
}
QString getString (QXmlStreamAttributes & a, QString name)
{
QString result = "";
if (a.hasAttribute (name))
{
result = a.value(name).toString();
}
return result;
}
int getNumber (QXmlStreamAttributes & a, QString name, int init = 0)
{
int result = init;
if (a.hasAttribute (name))
{
bool ok;
result = a.value(name).toInt(&ok);
if (! ok)
result = init;
}
return result;
}
QColor getColor (QXmlStreamAttributes & a, QString name, QColor init = QColor ("yellow"))
{
QColor result = init;
if (a.hasAttribute (name))
{
QString s = a.value(name).toString ();
result = QColor (s);
}
return result;
}
QString PenToString (QPen p)
{
return p.color().name();
}
QString BrushToString (QBrush b)
{
return b.color().name();
}
void MainWindow::on_action_Open_triggered()
{
QString fileName = QFileDialog::getOpenFileName (this, "Open file");
if (fileName != "")
openFile (fileName);
}
void MainWindow::openFile (QString fileName)
{
QFile f (fileName);
if (f.open (QFile::ReadOnly))
{
QXmlStreamReader r (&f);
while (! r.atEnd())
{
if (r.isStartElement() && r.name().toString() == "node")
{
QXmlStreamAttributes a = r.attributes();
QGraphicsEllipseItem * e = new QGraphicsEllipseItem;
QString name = getString (a, "name");
e->setToolTip(name);
int x = getNumber (a, "x");
int y = getNumber (a, "y");
int w = getNumber (a, "w", 100);
int h = getNumber (a, "h", 80);
e->setPos (x, y);
e->setRect (0, 0, w, h);
QColor c = getColor(a, "pen", QColor ("red"));
QColor d = getColor(a, "brush", QColor ("yellow"));
e->setPen(c);
e->setBrush(d);
e->setFlag (QGraphicsItem::ItemIsMovable);
scene->addItem(e);
}
r.readNext();
}
}
refreshTree ();
}
void MainWindow::refreshTree()
{
ui->tree->clear();
QTreeWidgetItem * top = new QTreeWidgetItem ();
top->setText(0, "data");
for (QGraphicsItem * item : scene->items(Qt::AscendingOrder))
{
TreeNode * node = new TreeNode ();
node->setText (0, item->toolTip());
node->item = item;
top->addChild (node);
}
ui->tree->addTopLevelItem (top);
ui->tree->expandAll();
}
QTableWidgetItem * MainWindow::addTableLine(QString name, QString value)
{
int cnt = ui->prop->rowCount();
ui->prop->setRowCount(cnt+1);
QTableWidgetItem * cell = new QTableWidgetItem;
cell->setText (name);
ui->prop->setItem (cnt, 0, cell);
cell = new QTableWidgetItem;
cell->setText (value);
ui->prop->setItem (cnt, 1, cell);
return cell;
}
void MainWindow::addColorLine (QString name, QColor value)
{
QTableWidgetItem * cell = addTableLine (name, value.name());
cell->setData (Qt::DecorationRole, value);
}
void MainWindow::refreshTable(QGraphicsItem * item)
{
ui->prop->setRowCount(0);
ui->prop->setColumnCount(2);
QStringList labels;
labels << "Name" << "Value";
ui->prop->setHorizontalHeaderLabels (labels);
addTableLine ("tooltip", item->toolTip());
addTableLine ("x", QString::number (item->x()));
addTableLine ("y", QString::number (item->y()));
QAbstractGraphicsShapeItem * shape =
dynamic_cast (item);
if (shape != nullptr)
{
addColorLine ("pen", shape->pen().color() );
addColorLine ("brush", shape->brush().color() );
}
}
void MainWindow::on_tree_itemDoubleClicked(QTreeWidgetItem * node, int column)
{
ui->prop->setRowCount(0);
TreeNode * tree_node = dynamic_cast (node);
if (tree_node != nullptr && tree_node->item != nullptr)
refreshTable (tree_node->item);
}
void MainWindow::on_action_Save_triggered()
{
QString fileName = QFileDialog::getSaveFileName (this, "Save file");
if (fileName != "")
{
setWindowTitle (fileName);
QFile f (fileName);
if (f.open (QFile::WriteOnly))
{
QXmlStreamWriter w (&f);
w.setAutoFormatting (true);
w.writeStartDocument();
w.writeStartElement("data");
for (QGraphicsItem * item : scene->items() )
{
QGraphicsEllipseItem * e =
dynamic_cast < QGraphicsEllipseItem * > (item) ;
if (e != nullptr)
{
w.writeStartElement("node");
w.writeAttribute ("name", e->toolTip());
w.writeAttribute ("pen", PenToString (e->pen()));
w.writeAttribute ("brush", BrushToString (e->brush()));
w.writeAttribute ("x", QString::number ( e->x() ));
w.writeAttribute ("y", QString::number ( e->y() ));
w.writeAttribute ("width", QString::number ( e->rect().width() ));
w.writeAttribute ("height", QString::number ( e->rect().height() ));
w.writeEndElement();
}
}
w.writeEndElement(); // end of data
w.writeEndDocument();
}
}
}
void MainWindow::on_action_Run_triggered()
{
QGraphicsEllipseItem * item = new QGraphicsEllipseItem;
item->setRect(0, 0, 100, 80);
item->setPos(100, 100);
item->setPen (QColor ("cornflowerblue"));
item->setBrush (QColor ("yellow"));
item->setToolTip("elipsa");
item->setFlag(QGraphicsItem::ItemIsMovable);
scene->addItem (item);
}
void MainWindow::on_action_Quit_triggered()
{
close ();
}
MainWindow::~MainWindow()
{
delete ui;
}