void QTextEdit::undo () [slot]

Alles rund um die Programmierung mit Qt
Antworten
joebar
Beiträge: 177
Registriert: 3. Oktober 2006 02:04

void QTextEdit::undo () [slot]

Beitrag 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.
phil collins
Beiträge: 19
Registriert: 22. August 2007 17:35

Beitrag 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 :wink:
Euer Phil.
Stefan Majewsky
Beiträge: 3
Registriert: 13. September 2007 20:22

Beitrag 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...
Antworten