Seite 1 von 1

in XML-Datei Werte übergeben, Qt bringt Fehlermeldung

Verfasst: 17. Februar 2014 14:34
von awendel
Hallo,


Ich bin neu hier und eig. kein richtig ausgebildeter Programmierer, sondern Maschinenbauer, da ich aber für mein eigenes Projekt um die Programmierung nicht rumkomme bringe ich es mir selbst bei. Deshalb bitte ich euch ein bisschen um Verständniss.

Zum Problem Selbst.

Ich schreibe ein Programm mit dem ich eine Maschine bedienen möchte. Das ganze erfolgt über den QT-Creator. Dabei soll der Bediener über Buttons der GUI bestimmte Sachen auswählen und ein Wert in einer XML-Datei gespeichert werden und später von einem anderen Programm ausgelesen und weiterverarbeitet werden.

Die XML-Datei erstelle ich über DOM und überschreibe Sie. Die Datei selbst habe ich als eine Ressourcedatei dem Projekt angehängt. Dies funktioniert auch. Nach beenden des programms erscheint jedoch die Meldung dass die XML-Datei ausßerhalb von dem QT Creator verändert wurde und es wird gefragt ob ich diese neu laden möchte.

Erst nach dem neuen Laden ändert sich der Wert der XML datei.


NUn wäre die frage was habe ich falsch gemacht und wie wäre die zu korrigieren.

Code: Alles auswählen








#include "gewichtsauswahl.h"
#include "ui_gewichtsauswahl.h"
#include <QtXml>
#include <QtCore>
#include <QDomDocument>
#include <QErrorMessage>
#include <qerrormessage.h>
#include <QDomNodeList>
#include <QDomNode>






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






    QDomDocument document("GewichtAusgewahltesMuesli");

    QDomElement root = document.createElement("AuswahlGewicht");

    document.appendChild(root);



    QDomElement Gewicht = document.createElement("Gewicht");

    root.appendChild(Gewicht);





    QFile file("C:/Users/alex/Desktop/Interface GUI/Version2/Automat/XMLwERTENEU.xml");

    if (!file.open(QIODevice::WriteOnly | QIODevice::Text))

    { }

    else
    {
        QTextStream stream(&file);
       stream<<document.toString();
       file.close();
    }
}

Gewichtsauswahl::~Gewichtsauswahl()
{
    delete ui;
}

void Gewichtsauswahl::on_ZuZusammenstellungsvariantenButton_clicked()
{
    close();
}

int Gewicht;

void Gewichtsauswahl::on_pushButton_clicked()
{
    klassenubersichtvorgefertigtemuesli = new KlassenubersichtVorgefertigteMuesli;
    klassenubersichtvorgefertigtemuesli->showFullScreen();


    // Open file
    QDomDocument doc("GewichtAusgewahltesMuesli");
    QFile file("C:/Users/alex/Desktop/Interface GUI/Version2/Automat/XMLwERTENEU.xml");
    if (!file.open(QIODevice::ReadOnly)) {

        return;
    }
    // Parse file
    if (!doc.setContent(&file)) {

       file.close();
       return;
    }
    file.close();

    //Modify content
    QDomNodeList list = doc.elementsByTagName("AuswahlGewicht");
    QDomNode parent = list.at(0);

    QDomNode n = parent.firstChild();
    if (n.isElement() && n.nodeName()=="Gewicht")
    {
    QDomElement e = n.toElement();
    e.setAttribute("", "500");
    }



    // Save content back to the file
    if (!file.open(QIODevice::Truncate | QIODevice::WriteOnly)) {

        return;
    }
    QByteArray xml = doc.toByteArray();
    file.write(xml);
    file.close();






};









void Gewichtsauswahl::on_pushButton_250Gramm_clicked()
{
    klassenubersichtvorgefertigtemuesli = new KlassenubersichtVorgefertigteMuesli;
    klassenubersichtvorgefertigtemuesli->showFullScreen();



    // Open file
    QDomDocument doc("GewichtAusgewahltesMuesli");
    QFile file("C:/Users/alex/Desktop/Interface GUI/Version2/Automat/XMLwERTENEU.xml");
    if (!file.open(QIODevice::ReadOnly)) {

        return;
    }
    // Parse file
    if (!doc.setContent(&file)) {

       file.close();
       return;
    }
    file.close();

    //Modify content
    QDomNodeList list = doc.elementsByTagName("AuswahlGewicht");
    QDomNode parent = list.at(0);

    QDomNode n = parent.firstChild();
    if (n.isElement() && n.nodeName()=="Gewicht")
    {
    QDomElement e = n.toElement();
    e.setAttribute("", "250");
    }



    // Save content back to the file
    if (!file.open(QIODevice::Truncate | QIODevice::WriteOnly)) {

        return;
    }
    QByteArray xml = doc.toByteArray();
    file.write(xml);
    file.close();



};


void Gewichtsauswahl::on_pushButton_100Gramm_clicked()
{
    klassenubersichtvorgefertigtemuesli = new KlassenubersichtVorgefertigteMuesli;
    klassenubersichtvorgefertigtemuesli->showFullScreen();





    // Open file
    QDomDocument doc("GewichtAusgewahltesMuesli");
    QFile file("C:/Users/alex/Desktop/Interface GUI/Version2/Automat/XMLwERTENEU.xml");
    if (!file.open(QIODevice::ReadOnly)) {

        return;
    }
    // Parse file
    if (!doc.setContent(&file)) {

       file.close();
       return;
    }
    file.close();

    //Modify content
    QDomNodeList list = doc.elementsByTagName("AuswahlGewicht");
    QDomNode parent = list.at(0);

    QDomNode n = parent.firstChild();
    if (n.isElement() && n.nodeName()=="Gewicht")
    {
    QDomElement e = n.toElement();
    e.setAttribute("", "100");
    }



    // Save content back to the file
    if (!file.open(QIODevice::Truncate | QIODevice::WriteOnly)) {

        return;
    }
    QByteArray xml = doc.toByteArray();
    file.write(xml);
    file.close();



};

Re: in XML-Datei Werte übergeben, Qt bringt Fehlermeldung

Verfasst: 17. Februar 2014 14:38
von awendel
Oder wird die datei als Ressourcedatei nicht benötigt, sondern muss nur in dem Ordner liegen, weil die XML-Datei an sich wird verändert ohne eine Abfrage

Re: in XML-Datei Werte übergeben, Qt bringt Fehlermeldung

Verfasst: 17. Februar 2014 16:14
von Scary Hallo
Ich weiß es ist immer blöd eine Frage mit einer Gegenfrage zu kontern. Aber warum tust du die XML-Datei in Resource-Datei? Dort kommen eigentlich Dateien rein, die nicht verändert werden. Bildchen, feste Texte und so.
Die Meldung vom Creator würde ich eher als Erfolg verbuchen. Er sagt dir, die Datei wurde verändert. Der Creator zeigt noch solange den alten Inhalt an, bis er die Datei neu ladet, aber geändert ist sie schon. Ich hoffe, ich hab dein Problem auch richtig verstanden.

Re: in XML-Datei Werte übergeben, Qt bringt Fehlermeldung

Verfasst: 17. Februar 2014 16:20
von awendel
Ahh ok,

dass war mir eben nicht von vorhinein klar, Danke!

Re: in XML-Datei Werte übergeben, Qt bringt Fehlermeldung

Verfasst: 17. Februar 2014 16:21
von Scary Hallo
Deshalb spricht man. :D
Viel Erfolg

Re: in XML-Datei Werte übergeben, Qt bringt Fehlermeldung

Verfasst: 20. Februar 2014 12:58
von awendel
Ich habe wieder ein Problem dass ich nicht hin bekomme, hoffe es kann mir jemand helfen.

In der XML Liste habe ich weitere elemente denen ja ein Wert zugewiesen werden soll. Mit meinem Code vom ersten Posting habe ich aber jedoch nur auf das erste Elemt der XML-Liste zugriff. Dies liegt ja an dem Teilcode:

Code: Alles auswählen

//Modify content
    QDomNodeList list = doc.elementsByTagName("AuswahlGewicht");
    QDomNode parent = list.at(0);

    QDomNode n = parent.firstChild();
    if (n.isElement() && n.nodeName()=="Gewicht")
    {
    QDomElement e = n.toElement();
    e.setAttribute("", "500");
    }
Weil ja immer auf das firstChild nzugegriffen wird.

Um nicht nicht nur auf das errste Element, sonder auf alle zugreifen zu können habe ich diesen code in den hier umgeschrieben:

Code: Alles auswählen

//Modify content
    QDomNodeList list = doc.elementsByTagName("Zutaten");
    if(!list.isEmpty()) { for(int i = 0; i < list.count(); ++i)
        { QDomNode n = list.at(i); if (n.isElement() && n.nodeName()=="Vollkornflakes")
            { QDomElement e = n.toElement(); e.setAttribute("", "ausgewahlt"); } } }

jedoch funktioniert dass nicht. Ist hier schon ein Fehler zu erkennen?


oder liegt es daran dass die Elemente der XML datei nicht richtig erstellt werden?, den code habe ich hier:

Code: Alles auswählen

QDomDocument document("ListeMitZutaten");

    QDomElement root = document.createElement("Zutaten");

    document.appendChild(root);




    // Basis Elemente

    QDomElement Element1= document.createElement("Element1");

    root.appendChild(Element1);


    QDomElement Element2= document.createElement("Element2");

   root.appendChild(Element2);


   QDomElement Element3= document.createElement("Element3");

  root.appendChild(Element3);


  QDomElement Element4= document.createElement("Element4");

 root.appendChild(Element4);

....





    QFile file("C:/Users/alex/Desktop/Interface GUI/Version2/Automat/XML-Liste-Zutaten.xml");

    if (!file.open(QIODevice::WriteOnly | QIODevice::Text))

    { }

    else
    {
        QTextStream stream(&file);
       stream<<document.toString();
       file.close();
    }