Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

In einem XML-File sind Texte für eine Checkliste hinterlegt, die in einem QT-Programm mittels QLabels ausgegeben werden sollen.


<?xml version="1.0" encoding="utf-8"?>
<checklist>
<headline>Checkliste</headline>
<check>Check1</check>
<check>Check2</check>
</checklist>
[/PHP]

Dieser Code liest die XML-Datei:

[PHP]
QDomDocument m_doc;
QFile file(FILE);
if (file.open(QIODevice::ReadOnly)) {
QByteArray content = file.readAll();
file.close();
//m_doc = new QDomDocument("checklist");
if (m_doc.setContent(content)) {
ParseFile(m_doc);
} else {
QMessageBox::information(this, "Fehler", QString(FILE) + " konnte nicht gelesen werden", QMessageBox::Ok);
}
} else {
QMessageBox::information(this, "Fehler", QString(FILE) + " konnte nicht geöffnet werden", QMessageBox::Ok);
}

void iDesignerStep1::ParseFile(QDomDocument m_doc) {
QVBoxLayout* layout = new QVBoxLayout;
QDomElement docElem = m_doc.documentElement();
QDomNode n = docElem.firstChild();
while(!n.isNull()) {
QDomElement e = n.toElement();
if(e.nodeName().compare("check") == 0) {
QLabel* l = new QLabel;
l->setWordWrap(true);
l->setText(e.firstChild().nodeValue());
//alternative l->setText(e.text());
//aber sowas geht: l->setText("TestText");
layout->addWidget(l);
}
n = n.nextSibling();
}
layout->addStretch(1);
setLayout(layout);
}

Wenn ich die Texte aus dem XML-File an die Labels zuweise, stürzt das Programm beim beenden im Desktruktor des Labels ab, und zwar genauer in der Funktion _CrtIsValidHeapPointer(const void * pUserData)... also irgendwo wird auf einen ungültigen Speicherbereich zugegriffen.

Schreibe ich jedoch direkt irgendeinen Text in das Label, funktioniert das. Ich habe auch schon probiert, den Text aus dem XML vorher in einen anderen String zu kopieren, aber egal was ich mache, sobald der Text aus dem XML kommt, stürzt das Programm beim beenden ab.

Jemand ne Idee woran das liegen könnte? Ich hab leider noch nicht viel Erfahrung mit QT.

  • Autor

Ich habe jetzt eine Lösung gefunden, verstehe aber leider das Problem nicht ganz. Anscheinend hängt es mit der Formatierung des QStrings zusammen.

l->setText(e.firstChild().nodeValue().toAscii()); 

funktioniert nämlich.

Wo werden die Informationen für die Formatierung hergeholt, im XML-File ist ja auch alles Plain-Text?!

Und warum stürzt der Destructor des QStrings ab, sollte dieser eine Formatierung enthalten?

Wo werden die Informationen für die Formatierung hergeholt, im XML-File ist ja auch alles Plain-Text?!
QLabel versucht beim Setzen des Textes, das Format zu erkennen. Offenbar läuft dabei etwas schief. Es sollte auch klappen, wenn du das Textformat des Labels vorher auf Qt::PlainText setzt.
  • Autor

Jetzt habe ich schon wieder ein ähnliches Problem:

Ich will ein QDomDocument speichern, bzw. den Inhalt als String haben.

Ich habs mit dom.save(...) und dom.toString() und dom.toByteArray() probiert, aber sobald ich eine Methode aufrufe, stürzt mir das Programm im Destructor des entsprechenden QStrings ab (selbe Stelle wie im ersten Posting), in den ich die Daten gespeichert habe.

Selbst die Zeile

QMessageBox::information(0,"debug", xml.toString(), QMessageBox::Ok);

führt zu einem Absturz... Nur eben nicht diese Zeile selber, sondern wenn am Funktionsende der Destruktor von QString aufgerufen wird.

Warum?

  • Autor

Die Fehlermeldung hab ich mal angehängt.

Unterschiedliche Laufzeitbibliotheken denk ich mal können es nicht sein. Ich benutze QT Commercial 4.1.4 mit Visual Studio 2005. Es sind auch keine anderen QT Versionen und auch keine anderen IDEs installiert.

post-20955-14430447398993_thumb.jpg

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.