Seite 1 von 1
void QTextEdit::undo () [slot]
Verfasst: 24. August 2007 15:29
von joebar
Hallo,
was ist die letzte Operation die in undo rückgängig gemacht wird? Solange ich nur tippe und kein copy & paste verwende scheint es der ganze Text zu sein. Ich hätte nur das letzte Zeichen erwartet? Kann ich erreichen, dass nur der letze Tastendruck ein Step in der undo Historie ist?
Danke,
J.
Verfasst: 26. August 2007 00:29
von phil collins
Hi.
Jedesmal, wenn du einen Buchstaben ect. eintippst, wird prinzipiell dem QUndoStack von QTextEdit ein neuer "InsertText"-Command o.ä. hinzugefügt. Dieser speichert Informationen darüber, wie er rückgängig gemacht oder wiederhergestellt werden kann, und(!) unterwelchen Umständen er mit dem letzten Command auf dem stack ge-merged werden darf. Ge-merged werden in der Regel ähnliche Befehle (siehe Tippen von mehreren Buchstaben hintereinander).
Was du vorhast, funktioniert, wenn man QTextEdit ein bisschen an der Nase herumführt. Dazu folgendes Beispiel:
Code: Alles auswählen
#include <QtGui>
using namespace std;
class Edit : public QTextEdit
{
protected:
void keyPressEvent(QKeyEvent* e) {
// checken, ob es sich um text handelt...
if(e->text()[0].isPrint()) {
e->accept();
// besorg dir den aktuellen QTextCursor...
QTextCursor c = textCursor();
// selektiere das Zeichen links vom Cursor...
c.movePosition(QTextCursor::Left, QTextCursor::KeepAnchor);
// auswahl speichern...
QString s = c.selectedText();
// zusammen mit dem Text vom event wieder einfügen...
c.insertText(s + e->text());
// dem Dokument den Cursor zurückgeben...
setTextCursor(c);
}
// falls kein Text, wird das Event wie gehabt abgearbeitet...
else
QTextEdit::keyPressEvent(e);
}
};
int main(int argc, char** argv) {
QApplication app(argc, argv);
Edit edit;
edit.show();
return app.exec();
}
Der Trick ist, das letzte Zeichen zu löschen und zusammen mit dem neuen wieder einzufügen. Da der Befehl zum ersetzten einer Selektion im Cursor nicht mit darauffolgenden gemerged wird, kannst du jetzt mit Strg+Z jedes Zeichen einzeln wieder löschen.
Das ist zwar richtig dreckig so, ich bezweifle aber, dass es eine elegeante Lösung für das Problem gibt!
Ich hoffe, ich konnte dir damit trotzdem weiterhelfen

Verfasst: 14. September 2007 18:16
von Stefan Majewsky
Kann man auf den QUndoStack eines QTextEdit auch direkt zugreifen?
Ich suche nämlich eine einfache Möglichkeit, nach einem textChanged()-Signal die konkret durchgeführte Aktion zu kriegen. Nach allem, was ich weiß, müsste ich dazu sämtliche KeyEvents selber behandeln...