Seite 1 von 1

Qt/Qt v4 Logging Fenster/Ausgabe eines Streams

Verfasst: 12. November 2005 18:28
von #pfo
Hat jemand Hints/Tips/refs/RTFM/As wenn es darum geht wie man ein Log/Debug Fenster mit Qt4 am elegantesten implementiert. Mein erster Ansatz aus der Hüfte herraus wäre gewesen die QTextEdit Klasse abzuleiten, sie auf read-only zu setzen, uU den Texttyp auf Qt::LogText und dann damit arbeiten. Aber so trivial ist das gar nicht und `logging'-Funktionalität ist doch für beinahe alle Applikationen substantiell. Gibt es da Klassen die ich bisher übersehen habe und die einem helfen könnten so etwas simpel zu realisieren? Wie wird das gängig gemacht? Wie sieht die Praxis aus?

Danke im Vorraus.

Verfasst: 13. November 2005 23:46
von klogg
QMessageBox

Vielleicht reicht dir das ja schon...
http://doc.trolltech.com/4.0/qmessagebox.html

HENNING

Verfasst: 16. November 2005 11:22
von #pfo
klogg hat geschrieben:QMessageBox

Vielleicht reicht dir das ja schon...
http://doc.trolltech.com/4.0/qmessagebox.html

HENNING
ich glaube du hast mich oben falsch verstande. ich will keine msgbox, sondern ein fenster auf den *dauernd* log msgs eintrudeln.

Verfasst: 16. November 2005 11:25
von FlorianBecker
Warum ist QTextEdit nicht trivial genung?

mit append( const QString &str ); fügst du jeweils eins neue Zeile an.

Verfasst: 16. November 2005 11:34
von klogg
So etwas habe ich selbst mal realisiert, in dem ich eine LogKlasse geschrieben habe,
in der sämtliche Funktionalität über statische Funktionen
(z.B. Festlegen einer Datei (bei dir Fenster), Schreiben von Text)
bereitgestellt wurde, so dass ich überall einfach nur die Klasse includen musste,
um LogEinträge anlegen zu können. Ein Objekt der Klasse gab es nicht.

Ungefähr so: LogKlasse::addLog(QString("Feldlänge = %1").arg(size));
Das wurde dann inklusive aktueller Zeit in eine festgelegte Datei geschrieben.

Ob das jetzt üblich oder elegant ist weiß ich nicht,
aber funktioniert hat's ganz prima.

HENNING

Verfasst: 18. November 2005 23:05
von Nassian
Du könntest auch einen eigenen MessageHandler (qInstallMessageHandler) installieren und den in dein Widget schreiben lassen. Dann kannst du die in Qt vorgesehenen Klassen qDebug, qWarning und qCritical (und ein paar mehr) verwenden.

Verfasst: 19. November 2005 12:16
von klogg
Nassian hat geschrieben:Dann kannst du die in Qt vorgesehenen Klassen qDebug, qWarning und qCritical (und ein paar mehr) verwenden.
Von diesen Klassen habe ich schon gehört, aber in der Dokumentation unter ALL CLASSES
werden sie nicht aufgeführt. *verwirrt* Also hmm tja wie...
help!

HENNING

Verfasst: 19. November 2005 16:44
von Nassian
such mal nach qDebug, qWarning, qCritical.
Am einfachsten wirds so verwendet:
QString strMessage = "Hallo";
char *szMessage = "Welt";
qDebug() << strMessage << szMessage;
ergibt: "Hallo" "Welt"

Das setzt um Variablenwerte automatisch Hochkommas und zwischen Streamoperatoren Leerzeichen.

Mfg,
Alex

Verfasst: 22. Februar 2006 12:58
von Psychodad
Das TextEdit Widget scheint aber nicht perfekt zu sein wenn es um größer Logs geht. In meinem Fall werden einige tausend Zeilen Text gelogt. Diese werden derzeit über QTextEdit->append(QString) angehängt. Das Widget hat drops eingeschaltet und ist readonly.

Leider gibt es einen massiven Leistungseinbruch bei großen Textmengen. Jeder Klick der zum Neuzeichnen des TextEdits führt ist extrem langsam. Ich vermute mal das es daran liegt, das es keinen "Überlauf" gibt. Daher bei mehr als 500Zeilen sollten alte Zeilen gelöscht werden.

Wie macht man das am schlausten?

Mit TextEdit: wie bekomme ich die alten Zeilen gelöscht?
Oder ein anderes Widget?

Verfasst: 22. Februar 2006 15:23
von m.trix
Ich hab das, wovon du sprichst, mal mit einem QListWidget realisiert.

Verfasst: 22. Februar 2006 15:26
von macman
Psychodad hat geschrieben:Das TextEdit Widget scheint aber nicht perfekt zu sein wenn es um größer Logs geht.
Richtext ausgeschaltet? Ich würde es auch ehr mit einem QListWidget probieren. Jede Zeile ein neues Item und sobald es mehr als n werden, schmeißt Du die ersten wieder weg. Keine Ahnung wie schnell das ist, wirst Du dann sehen.

Verfasst: 22. Februar 2006 16:50
von Psychodad
Danke werde das dann wohl per ListWidget machen.