ich habe eine Frage bezüglich der Ctrl-Modifier-Taste!
In einem eventFilter() versuche ich, nur bestimmte Tasteneingaben für ein
QLineEdit-Objekt zu aktzeptieren.
=> Auf die Verwendung eines QValidators muss ich verzichten, weil ich den
Text entsprechend anpassen muss.
Akzeptiert werden sollen...
- Buchstaben von A-Z mit Umlaute (Ä, Ö, Ü),
- Zahlen von 0-9 u.
- die Tasten F1-F12.
Entsprechend soll auch die jeweilige Taste in QLineEdit visualisiert werden,
also für F1-Taste z. B. "F1". Außerdem sollen alle Buchstaben immer groß
dargestellt werden.
Andere Ereignisse, wie z. B. Fokus, sollen wie gewohnt behandelt werden.
Mein bisheriger Code:
Code: Alles auswählen
bool CreateContext::eventFilter(QObject *target, QEvent *event)
{
if(event->type() == QEvent::KeyPress && target == keyInput)
{
QKeyEvent *keyEvent = dynamic_cast<QKeyEvent*>(event);
if(keyEvent->isAutoRepeat())
return true;
else
keyEvent->accept();
int key = keyEvent->key();
qDebug() << QString::number(key);
// on tab, do...
if(key == Qt::Key_Tab)
return false;
if((key >= Qt::Key_0 && key <= Qt::Key_9) || (key >= Qt::Key_A && key <= Qt::Key_Z)
|| key == Umlauts::Adiaeresis /*äÄ*/ || key == Umlauts::Odiaeresis /*öÖ*/
|| key == Umlauts::Udiaeresis /*üÜ*/ || (key >= Qt::Key_F1 && key <= Qt::Key_F12))
{
// only go on if currently pressed key is different to the one before
if(key != lastKey)
{
lastKey = key;
QString str = keyEvent->text();
// for a-z & umlauts
// always make uppercase
if((key >= Qt::Key_A && key <= Qt::Key_Z) || key == Umlauts::Adiaeresis
|| key == Umlauts::Odiaeresis || key == Umlauts::Udiaeresis)
str = str.toUpper();
// for keys F1-F12
else if(key >= Qt::Key_F1 && key <= Qt::Key_F12)
{
str = 'F';
switch(key)
{
case Qt::Key_F1: str = str + '1'; break;
case Qt::Key_F2: str = str + '2'; break;
case Qt::Key_F3: str = str + '3'; break;
case Qt::Key_F4: str = str + '4'; break;
case Qt::Key_F5: str = str + '5'; break;
case Qt::Key_F6: str = str + '6'; break;
case Qt::Key_F7: str = str + '7'; break;
case Qt::Key_F8: str = str + '8'; break;
case Qt::Key_F9: str = str + '9'; break;
case Qt::Key_F10: str = str + "10"; break;
case Qt::Key_F11: str = str + "11"; break;
case Qt::Key_F12: str = str + "12"; break;
default: str = str + 'X'; break;
}
}
// for keys 0-9
else
{
// ...
}
keyInput->setText(str);
}
}
else if(key == Qt::Key_Delete || key == Qt::Key_Backspace)
{
if(!keyInput->text().isEmpty())
{
keyInput->clear();
lastKey = 0;
}
}
return true;
}
return QWidget::eventFilter(target, event) /*false*/;
}
Dies wird bei der Eingabe einer Nummern-Taste deutlich. Wenn ich z. B.
die Taste-0 in Kombination mit Ctrl drücke, erscheint das '='-Zeichen!
Eine erneute Eingabe der selben Nummern-Taste (aber ohne Ctrl) führt
zu gar keiner Aktualisierung des Textes, weil der Tasten-Code der
selbe ist.
Meine Frage: Ist es möglich, die Ctrl-Taste (oder allgemein, die Modifier-Tasten)
zu ignorieren, sprich, aus dem keyEvent irgendwie zu entfernen?
Bedanke mich für sinnvolle Hilfe schon mal im Vorraus.