Wie Modifier-Taste ignorieren?

Alles rund um die Programmierung mit Qt
Antworten
MADsCIENTIST

Wie Modifier-Taste ignorieren?

Beitrag von MADsCIENTIST »

Hallo liebe Community,

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*/;
}
Womit ich jetzt noch Probleme habe, ist - wie gesagt - der Ctrl-Modifier.
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.
sigvdr
Beiträge: 100
Registriert: 1. Juli 2008 19:29

Re: Wie Modifier-Taste ignorieren?

Beitrag von sigvdr »

Hallo,

Aus einem meiner Projekte stammt dieser Code um Tastatureingaben in eine lesbare Form umzuwandeln
z.B. "F1" oder "Alt-0" ....

Code: Alles auswählen

void UserKeys::keyPressEvent(QKeyEvent *event){
    if ( ui->pBRemote->isChecked() ) {
        QString keyName = keyEventToString(event);
        event->ignore();
        ....  mach hier was du willst mit dem keyName
        return;
    } else {
        QWidget::keyPressEvent(event);
    }
}

QString keyEventToString(QKeyEvent *keyEvent){
    int keyInt = keyEvent->key();
    Qt::Key key = static_cast<Qt::Key>(keyInt);
    if(key == Qt::Key_unknown){
        //qDebug() << "Unknown key from a macro probably";
        return "";
    }
    // check for a combination of user clicks
    Qt::KeyboardModifiers modifiers = keyEvent->modifiers();

    //QList<Qt::Key> modifiersList;
    if(modifiers & Qt::ShiftModifier)
        keyInt += Qt::SHIFT;
    if(modifiers & Qt::ControlModifier)
        keyInt += Qt::CTRL;
    if(modifiers & Qt::AltModifier)
        keyInt += Qt::ALT;
    if(modifiers & Qt::MetaModifier)
        keyInt += Qt::META;

    return QKeySequence(keyInt).toString(QKeySequence::NativeText);
}
Gruß Sig
Antworten