Seite 1 von 1

[gelöst] QTextEdit nur Großbuchstaben zulassen

Verfasst: 7. August 2007 18:05
von junior0007
Hallo,

ich versuche verzweifelt in einem QTextEdit-Feld nur Großbuchstaben zuzulassen.

Code: Alles auswählen

void TextEdit::keyPressEvent ( QKeyEvent * e )
{
	// kleines a abfangen
	if(e->key() == Qt::Key_A && e->modifiers() == Qt::NoModifier )
	{
            // neuen Event erzeugen --> Speicherloch???   
            e = new QKeyEvent(QEvent::KeyPress, Qt::Key_A, Qt::ShiftModifier);
	}
        // Event weiterreichen
	QTextEdit::keyPressEvent(e);
}
Also eigentlich wollte ich alle Kleinbuchstaben abfangen, und die jeweiligen Events durch Events mit Großbuchstaben ersetzen. (Zum Testen läuft das bisher mal nur für a's...) Allerdings glaub ich (so wie ich es mache) ein Speicherloch aufzureißen und ausserdem klappt es einfach nicht :-( Jedes kleine a wird jetzt konsequent ignoriert...

Kann mir vlt. jemand auf die Sprünge helfen?
Danke

Verfasst: 7. August 2007 23:14
von Burgpflanze
Schau dir mal QValidator an.

Verfasst: 8. August 2007 08:56
von junior0007
Hi,

Danke, QValidator ist natürlich auch eine nette Idee, aber es löst nicht mein Problem.

Ich möchte fehlerhafte Eingaben (Kleinbuchstaben) durch richtige (GroßBuchstaben) ersetzen. Erkennen kann ich Kleinbuchstaben ja schon, nur ersetzen kann ich sie nicht :-(

Gruß
Junior

Verfasst: 8. August 2007 17:12
von junior0007
Hallo nochmal,

ich hab ein wenig rumprobiert und raus kam das:

Code: Alles auswählen

void TextEdit::keyReleaseEvent ( QKeyEvent * e )
{
	// if Shift-Key is NOT pressed and key is character
	// of key is ö, ä or ü
	if((e->modifiers() == Qt::NoModifier && (e->key() >= 0X41) && (e->key() <= 0x5a)) 
			|| e->key() == 196 || e->key() == 214 || e->key() == 220)
	{
		QTextCursor dummy = this->textCursor();
		dummy.deletePreviousChar();
		dummy.insertText(e->text().toUpper());
	}
	QTextEdit::keyReleaseEvent(e);	
}
Funktioniert zwar nur beim langsam schreiben, aber vlt. fällt ja irgendjemanden noch eine bessere Lösung ein...

Gruß
Junior

Verfasst: 22. August 2007 18:41
von phil collins
Hi.

Hab da 'ne schicke Lösung:

Code: Alles auswählen

void keyPressEvent(QKeyEvent* e) {
	QString s = e->text();
	if(s[0].isPrint()) {
		e->accept();
		QKeyEvent* e2 = new QKeyEvent(e->type(), e->key(), e->modifiers(), 
			s.toUpper(), e->isAutoRepeat(), e->count());
		QTextEdit::keyPressEvent(e2);
	} else
		QTextEdit::keyPressEvent(e);
}
Worauf's bei diesem event ankommt, ist gar nicht so sehre der "key()", sonder viel mehr der "text()". Durch den Befehl e->accept() wird - soweit ich weiß - das event als "abgearbeitet" markiert, und ich gehe davon aus, dass es dann später noch automatisch vom heap entfernt wird.

Convert loewr to Upper

Verfasst: 23. August 2007 12:13
von neuschi
Nicht schön, nicht schnell... aber geht:

Code: Alles auswählen

class MyEdit : public QTextEdit
{
public:
	MyEdit (QWidget *p=0) : QTextEdit(p)
	{
	}
	
	void keyPressEvent ( QKeyEvent * event ) 
	{
	
		QString t = event->text();
		if (!t.isEmpty())
		{
			QChar c = t.at(0);
			if (c.isLower())
			{
				insertPlainText(c.toUpper());
				return;
			}
		}
		
		QTextEdit::keyPressEvent(event);
	}
};

Verfasst: 3. September 2007 14:44
von junior0007
Sorry war im Urlaub ;-)

Supi Lösungen - Danke!