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.
void QTextEdit::undo () [slot]
-
phil collins
- Beiträge: 19
- Registriert: 22. August 2007 17:35
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:
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
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();
}
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
Euer Phil.
-
Stefan Majewsky
- Beiträge: 3
- Registriert: 13. September 2007 20:22