QTextEdit & simple "Terminal"
Verfasst: 23. Mai 2007 15:58
Hallo,
ich bin recht neu hier und auch recht neu bei der Qt entwicklung - ist mein erstes Projekt mit Qt. Daher kommen so die ein oder anderen Fragen.
Ich bekomme über den Seriellen Port Ausgaben eines Terminals herein (bsp. Bootender Linux-Kernel). Diese Ausgaben möchte ich innerhalb meiner Anwendung darstellen. Damit die ganzen Positionierungen funktionieren, sollte ich zumindest die ein oder anderen Terminal-Befehle abfangen und behandeln.
Zur Ausgabe selber habe ich ein QTextEdit genommen. Funktioniert auch soweit. Wichtig sind vor allem Steuer-Chars wie 0x08 (backspace), 0x0d (carriage return) oder 0x0a (new line).
Jetzt gibt es den Fall, das eine Anwendung mir über die serielle schnitstelle einen Countdown ausgibt und bevor die Zahl geschrieben wird 3x 0x08 mitschickt damit der Cursor zur Ausgabe positioniert und die vorherige Zahl überschrieben wird. Also speicher ich mir einfach die letzte Zeile im QTextEdit, entferne sie, überschreibe das entsprechende Zeichen und füge die Zeile wieder ein. Der code sieht folgender maßen aus:
Später wird der termBuf string mit Hilfe der neuen Daten abgeändert und wieder eingesetzt, wobei auch der bisherige Text gelöscht wird:
Nun zu meiner Frage: man sieht man immer wieder, das mal 'ne Zeile markiert und ersetzt wird. Kann man das irgendwie verhindern? Kann man die Aktualisierung eines Widgets nach bedarf ab- und wieder einschalten? Ist auf Dauer irgendwie störend wenn es so flackert.
Was natürlich noch besser wäre: gibt es ggf. Widgets für Qt, welche bereits ein Terminal emulatieren, so daß ich den Text nur noch direkt zuweisen muß. Dann könnte ich nämlich auch die ANSI steuersequenzen verwenden.
Ich verwende übrigens Qt3 unter Linux.
Thnx
Marc
ich bin recht neu hier und auch recht neu bei der Qt entwicklung - ist mein erstes Projekt mit Qt. Daher kommen so die ein oder anderen Fragen.
Ich bekomme über den Seriellen Port Ausgaben eines Terminals herein (bsp. Bootender Linux-Kernel). Diese Ausgaben möchte ich innerhalb meiner Anwendung darstellen. Damit die ganzen Positionierungen funktionieren, sollte ich zumindest die ein oder anderen Terminal-Befehle abfangen und behandeln.
Zur Ausgabe selber habe ich ein QTextEdit genommen. Funktioniert auch soweit. Wichtig sind vor allem Steuer-Chars wie 0x08 (backspace), 0x0d (carriage return) oder 0x0a (new line).
Jetzt gibt es den Fall, das eine Anwendung mir über die serielle schnitstelle einen Countdown ausgibt und bevor die Zahl geschrieben wird 3x 0x08 mitschickt damit der Cursor zur Ausgabe positioniert und die vorherige Zahl überschrieben wird. Also speicher ich mir einfach die letzte Zeile im QTextEdit, entferne sie, überschreibe das entsprechende Zeichen und füge die Zeile wieder ein. Der code sieht folgender maßen aus:
Code: Alles auswählen
int curParagraph = edit->paragraphs() - 1;
int curParagraphPos = edit->paragraphLength(curParagraph);
bool delLastLine = false;
string termBuf;
size_t insPos = 0;
// War die letzte Zeile mit einem \n abgeschloßen (wenn ja ist curParagraphPos = 0).
if (curParagraphPos > 0)
{
termBuf = edit->text(curParagraph).ascii();
termBuf.erase(termBuf.end() - 1 ); // Es wird ein Leerzeichen zu viel geliefert.
insPos = termBuf.size();
delLastLine = true;
}
Code: Alles auswählen
if (delLastLine)
{
delLastLine = false;
edit->setSelection(curParagraph, 0, curParagraph, curParagraphPos);
edit->removeSelectedText();
}
edit->insertAt(termBuf, curParagraph, 0);
Was natürlich noch besser wäre: gibt es ggf. Widgets für Qt, welche bereits ein Terminal emulatieren, so daß ich den Text nur noch direkt zuweisen muß. Dann könnte ich nämlich auch die ANSI steuersequenzen verwenden.
Ich verwende übrigens Qt3 unter Linux.
Thnx
Marc