Qt/Qt v4 Logging Fenster/Ausgabe eines Streams

Alles rund um die Programmierung mit Qt
Antworten
#pfo
Beiträge: 5
Registriert: 12. November 2005 18:22
Wohnort: wien

Qt/Qt v4 Logging Fenster/Ausgabe eines Streams

Beitrag 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.
klogg
Beiträge: 129
Registriert: 5. September 2005 17:00
Wohnort: Hann. Münden

Beitrag von klogg »

QMessageBox

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

HENNING
#pfo
Beiträge: 5
Registriert: 12. November 2005 18:22
Wohnort: wien

Beitrag 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.
FlorianBecker
Beiträge: 1213
Registriert: 2. Dezember 2004 10:54
Kontaktdaten:

Beitrag von FlorianBecker »

Warum ist QTextEdit nicht trivial genung?

mit append( const QString &str ); fügst du jeweils eins neue Zeile an.
klogg
Beiträge: 129
Registriert: 5. September 2005 17:00
Wohnort: Hann. Münden

Beitrag 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
Nassian
Beiträge: 126
Registriert: 20. Juni 2005 21:14

Beitrag 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.
klogg
Beiträge: 129
Registriert: 5. September 2005 17:00
Wohnort: Hann. Münden

Beitrag 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
Nassian
Beiträge: 126
Registriert: 20. Juni 2005 21:14

Beitrag 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
Psychodad
Beiträge: 15
Registriert: 26. November 2005 07:30

Beitrag 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?
m.trix
Beiträge: 49
Registriert: 12. Oktober 2005 09:51
Wohnort: Manhattan

Beitrag von m.trix »

Ich hab das, wovon du sprichst, mal mit einem QListWidget realisiert.
macman
Beiträge: 1738
Registriert: 15. Juni 2005 13:33
Wohnort: Gütersloh
Kontaktdaten:

Beitrag 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.
Psychodad
Beiträge: 15
Registriert: 26. November 2005 07:30

Beitrag von Psychodad »

Danke werde das dann wohl per ListWidget machen.
Antworten