#ifndef MAINWINDOW_H #define MAINWINDOW_H #include #include 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 #include 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 (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); } }