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