Показать записи данных (xml) из папки в таблице в Qt - PullRequest
0 голосов
/ 08 ноября 2019

У меня проблема. Я хочу загрузить и показать записи данных (xml) в папке в таблице. Форма выглядит следующим образом:

Screenshot of table view form

У меня есть несколько xml файлов в папке:

QString path = QCoreApplication::applicationDirPath()+"/data/";

образец xml (entry_1) выглядит следующим образом:

<!DOCTYPE dataentry>
<subject_details>
 <Name>Pete</Name>
 <Surname>Batty</Surname>
 <Patient_ID>GH34TRM</Patient_ID>
 <Date>06/11/2019 16:00</Date>
</subject_details>

Если у меня есть несколько записей, запись 2, запись 3, запись 4 и т. д. Как мне проанализировать содержимое каждой записи и отобразить в таблице?

Заранее спасибо

1 Ответ

1 голос
/ 10 ноября 2019
  1. Создайте QDirIterator для перебора всех файлов в каталоге. Вы можете добавить фильтр, так что он будет искать файлы только в формате entry_ number .xml.

  2. . Используйте QXmlStreamReader для итерации всех элементовXML-файлПоскольку вы знаете формат XML-файла, вы можете просто искать ваши конкретные элементы.

  3. Добавить новую запись в вашу таблицу. в этом случае я использовал QTableWidget, так как было неясно, используете ли вы это или QTableView (в следующий раз, пожалуйста, включите часть кода, который у вас уже есть).

  4. Отформатируйте таблицу какнеобходимо.

Example running application

MainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QDebug>
#include <QFile>
#include <QDirIterator>
#include <QXmlStreamReader>
#include <QMessageBox>


QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    void parseDataEntry(const QString dataPath);
};
#endif // MAINWINDOW_H

MainWindow.cpp

#include "MainWindow.h"
#include "ui_MainWindow.h"


MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);


    // Setup table
    ui->tableWidget->setColumnCount(4);
    ui->tableWidget->setHorizontalHeaderLabels(QStringList{"Patient ID","Name", "Surname", "LastSession"});
    ui->tableWidget->horizontalHeader()->setSectionResizeMode(QHeaderView::Stretch);

    // Our data path
    QString path = QCoreApplication::applicationDirPath()+"/data/";


    // Filter only files that fit our naming convention.
    QStringList qdiFilter("entry_*.xml");


    // Iterate through all found files, parse each file to be added to the table.
    QDirIterator qdi( path, qdiFilter, QDir::Files);
    while (qdi.hasNext())
    {
        parseDataEntry(qdi.next());

    }

}



void MainWindow::parseDataEntry(const QString dataPath)
{
    QString patientID, firstName, surName, lastSession = "";

    // Load our XML file.
    QFile *xmlFile;
    xmlFile = new QFile(dataPath);
    if(!xmlFile->open(QIODevice::ReadOnly | QIODevice::Text))
    {
        QMessageBox::critical(this,
                              "Error Loading Patient Data File",
                              QString("Could not load the patient XML data file at:\r\n  %0").arg(dataPath),
                              QMessageBox::Ok);
        return;
    }

    // Create an XML reader.
    QXmlStreamReader *xmlReader;
    xmlReader = new QXmlStreamReader(xmlFile);


    // Parse each element of the XML until we reach the end.
    while(!xmlReader->atEnd() && !xmlReader->hasError()) {
        // Read next element
        QXmlStreamReader::TokenType token = xmlReader->readNext();

        // If token is just StartDocument - go to next
        if(token == QXmlStreamReader::StartDocument) {
            continue;
        }

        // If token is StartElement - read it
        if(token == QXmlStreamReader::StartElement) {

            if(xmlReader->name() == "Name") {
                firstName = xmlReader->readElementText();

            } else if(xmlReader->name() == "Surname") {
                surName = xmlReader->readElementText();
            }
            else if(xmlReader->name() == "Patient_ID") {
                patientID = xmlReader->readElementText();
            }
            else if(xmlReader->name() == "Date") {
                lastSession = xmlReader->readElementText();
            }
        }
    }

    if(xmlReader->hasError()) {
        QMessageBox::critical(this,
                              "Error Parsing Patient Data File",
                              QString("Error reading the patient file at:\r\n  %0,\r\nError:  %1").arg(dataPath,
                                                                                                       xmlReader->errorString()),
                              QMessageBox::Ok);
        return;
    }


    // close reader and flush file
    xmlReader->clear();
    xmlFile->close();


    // Delete
    delete xmlFile;
    delete xmlReader;


    // Add a new row to the table, with the data we parsed.
    ui->tableWidget->insertRow(ui->tableWidget->rowCount());
    ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1,
                             0,
                             new QTableWidgetItem(patientID));
    ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1,
                             1,
                             new QTableWidgetItem(firstName));
    ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1,
                             2,
                             new QTableWidgetItem(surName));
    ui->tableWidget->setItem(ui->tableWidget->rowCount() - 1,
                             3,
                             new QTableWidgetItem(lastSession));
}



MainWindow::~MainWindow()
{
    delete ui;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...