Elemente einer XML in QListWidget anzeigen
-
@theAnfänger77
Das ist ja echt komisch. Du machst jetzt also seit einem Jahr C++ und weißt nicht, wie das funktioniert?
-
Komisch ist, dass die Datei wirklich geöffnet wurde, sonst würde dieses Programm eine Fehlermeldung ausgeben:
MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); QFile datei("DATEI.xml"); datei.open(QIODevice::ReadOnly); QXmlStreamReader xmlReader(&datei); if(xmlReader.hasError()) QMessageBox::critical(this, "Fehler", "Datei wurde nicht geöffnet."); while (!(xmlReader.atEnd())) { xmlReader.readNext(); ui->listWidget->addItem(xmlReader.readElementText()); } datei.close(); }
-
@theAnfänger77 sagte in Elemente einer XML in QListWidget anzeigen:
Du prüfst dem xml Stream nicht die Datei...
if(!datei.open(QIODevice::ReadOnly)) { QMessageBox::critical(this, "Fehler", "Datei wurde nicht geöffnet."); return; } //... xmlReader.readNext(); if(xmlReader.hasError()) QMessageBox::critical(this, "Fehler", "Xml geht zu Weihnachten nicht.");
QT hat eigentlich eine ganz brauchbare Doku, vlt guckst du dir die Beispiele da mal an
-
Ah! Sorry!
So natürlich:MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); QFile datei("DATEI.xml"); //Die Datei DATEI.xml ist im Build-Verzeichnis if(datei.exists() == false) QMessageBox::critical(this, "Fehler", "Datei existiert nicht."); datei.open(QIODevice::ReadOnly); QXmlStreamReader xmlReader(&datei); while (!(xmlReader.atEnd())) { xmlReader.readNext(); ui->listWidget->addItem(xmlReader.readElementText()); } datei.close(); }
-
Das close brauchst nicht, das macht der Destruktor.
Man sollte evtl. den Rückgabewert von open prüfen.
-
Das ist es!
Das Öffnen hat nicht funktioniert.
Der Fehler muss also bei folgendem Code in Zeile 11 sein:MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent) , ui(new Ui::MainWindow) { ui->setupUi(this); QFile datei("DATEI.xml"); //Die Datei DATEI.xml ist im Build-Verzeichnis if(datei.exists() == false) QMessageBox::critical(this, "Fehler", "Datei existiert nicht."); datei.open(QIODevice::ReadOnly); //HAT NICHT FUNKTIONIERT !!! if(!datei.open(QIODevice::ReadOnly)) { QMessageBox::critical(this, "Fehler", "Datei wurde nicht geöffnet."); return; } QXmlStreamReader xmlReader(&datei); while (!(xmlReader.atEnd())) { xmlReader.readNext(); ui->listWidget->addItem(xmlReader.readElementText()); } }
Aber jetzt ist die Frage warum
datei.open(QIODevice::ReadOnly);
nicht funktioniert.
-
Warum versuchst du die Datei zweimal zu öffnen???
Dass sie beim zweiten Malfalse
zurückliefert, kann beabsichtigt sein.
-
Stimmt!
Wenn ich Zeile 11 rausnehme kommt keine Fehlermeldung.
Aber das bedeutet ja, dass die Datei geöffnet ist!
Und am QXmlStreamReader hängt es wohl auch nicht:if(xmlReader.hasError()) QMessageBox::critical(this, "Fehler", "Xml geht zu Weihnachten nicht.");
-
Am besten, du benutzt den Debugger dafür (oder Testausgaben per Konsole o.ä.).
Code-technisch kannst du dich auch an QXmlStream Bookmarks Example oder Reading an XML cookbook file with QXmlStreamReader orientieren (dort wird
readNextStartElement()
stattreadNext()
benutzt).
-
Hey, vielen Dank!
Hab jetzt durch Wurschteln und Ausprobieren diese Funktionierende Version:
(Hab die Fehlerbehandlungen rausgenommen um es prägnanter zu machen)MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); QFile datei("DATEI.xml"); datei.open(QIODevice::ReadOnly); QXmlStreamReader xmlReader(&datei); xmlReader.readNext(); while (!(xmlReader.atEnd())) { if (xmlReader.readNext() == QXmlStreamReader::StartElement) { if (xmlReader.name() == "eintrag") ui->listWidget->addItem(xmlReader.readElementText()); } } }
Hier noch die XML:
<?xml version="1.0" encoding="UTF-8"?> <eintraege> <eintrag>DAS</eintrag> <eintrag>PROBLEM</eintrag> <eintrag>IST</eintrag> <eintrag>GELOEST</eintrag> </eintraege>
Aber keine Ahnung, warum das Programm nur so die Einträge anzeigt.