[[xml_2019]]
 
#ifndef MAINWINDOW_H
#define MAINWINDOW_H
 
#include <QMainWindow>
#include <QTreeWidgetItem>
 
namespace Ui {
class MainWindow;
}
 
class MainWindow : public QMainWindow
{
    Q_OBJECT
 
public:
    explicit MainWindow(QWidget *parent = nullptr);
    ~MainWindow();
 
private slots:
    void on_action_Open_triggered();
 
    void on_treeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column);
 
private:
    Ui::MainWindow *ui;
};
 
#endif // MAINWINDOW_H
#include "mainwindow.h"
#include "ui_mainwindow.h"
 
MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
}
 
MainWindow::~MainWindow()
{
    delete ui;
}
 
#include <QFileDialog>
#include <QXmlStreamReader>
 
class TreeItem : public QTreeWidgetItem
{
public:
     int line;
     int col;
     TreeItem () : line (0), col (0) { }
};
 
void MainWindow::on_action_Open_triggered()
{
    QString name = QFileDialog::getOpenFileName(this, "Open XML file", "../xml");
    QFile f (name);
    if (f.open (QFile::ReadOnly | QFile::Text))
    {
        QTreeWidgetItem * active = ui->treeWidget->invisibleRootItem();
        QXmlStreamReader r (&f);
        while (! r.atEnd ())
        {
            if (r.isStartElement())
            {
                TreeItem * node = new TreeItem;
                node->setText (0, r.name().toString() );
                node->setForeground (0, QColor ("green"));
                node->line = r.lineNumber();
                node->col = r.columnNumber();
                active->addChild (node);
                active = node;
 
                QXmlStreamAttributes attr = r.attributes();
                for (QXmlStreamAttribute a : attr)
                {
                    QString s = a.name().toString() + " = " + a.value().toString();
                    QTreeWidgetItem * item = new QTreeWidgetItem;
                    item->setText (0, s);
                    item->setForeground (0, QColor ("red"));
                    node->addChild (item);
                }
            }
            else if (r.isEndElement())
            {
                active = active->parent ();
            }
            else if (r.isCharacters())
            {
                QString s = r.text().toString().simplified();
                if (s != "")
                {
                    QTreeWidgetItem * node = new QTreeWidgetItem;
                    node->setText (0, s);
                    node->setForeground (0, QColor ("blue"));
                    active->addChild (node);
                }
            }
            r.readNext();
        }
        ui->treeWidget->expandAll ();
        f.seek(0);
        ui->textEdit->setText (f.readAll());
        f.close ();
    }
}
 
void MainWindow::on_treeWidget_itemDoubleClicked(QTreeWidgetItem *item, int column)
{
   TreeItem * p = dynamic_cast<TreeItem*> (item);
   if (p != nullptr)
   {
      QTextCursor c = ui->textEdit->textCursor();
      c.movePosition (QTextCursor::Start);
      c.movePosition (QTextCursor::NextBlock, QTextCursor::MoveAnchor, p->line-1);
      c.movePosition (QTextCursor::EndOfLine, QTextCursor::KeepAnchor);
      ui->textEdit->setTextCursor (c);
   }
 
}
 
xml_2019.txt · Last modified: 2019/04/01 17:08 by 147.32.8.115
 
Recent changes RSS feed Creative Commons License Donate Powered by PHP Valid XHTML 1.0 Valid CSS Driven by DokuWiki