Tastatureingaben

Python und das Qt-Toolkit, erstellen von GUIs mittels des Qt-Designers.
Antworten
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

Hallo,
ich bin gerade dabei mir für mein N900 eine Fernbedienung für ein Mythfrontend zu programmieren. Ich möchte neben Buttons auch gerne die Tastatur verwenden können. Das Frontend nimmt Strings entgegen und reagiert entsprechend darauf. Ich bin bisher soweit gekommen, dass ich keyPressEvent überschreibe und zunächst mir mal den key-text auf der Konsole ausgeben lasse:

Code: Alles auswählen

import sys
from PyQt4 import QtGui

class Keyboard_Widget(QtGui.QMainWindow):
     def __init__(self, parent=None):
         QtGui.QMainWindow.__init__(self, parent)
         self.show()

     def keyPressEvent(self, event):
         if type(event) == QtGui.QKeyEvent:
             print 'Text:', event.text()
             print 'nativeScanCode:', event.nativeScanCode()

if __name__ == "__main__":
     app = QtGui.QApplication(sys.argv)
     widget = Keyboard_Widget()
     sys.exit(app.exec_())
Das Problem ist nur, dass die Modifiertasten wie Pfeil hoch/runter und Shift,Alt Strg ja keinen Text zugewiesen haben. Über nativeScanCode bekomme ich int-Werte, die ich ggf. dann zuordnen könnte. Meine Frage ist, ob ich mir jetzt die Arbeit machen muss und jede Zahl einer Taste zuordnen muss, oder ob es eine Möglichkeit gibt die Keymap des BS zu benutzen?

Ich frage deshalb, weil ich mein Programm auf einer gtk-Version aufbaue und dort die Keyboard-Abfrage über gtk.gdk.keyval_name(event.keyval) durchgeführt wurde.

Gruß EmaNymton
lunar

Mit Verlaub, doch diese Frage kannst Du Dir durch das Lesen der Dokumentation zu "QKeyEvent" selbst beantworten.

Die Prüfung des Ereignistyps ist übrigens überflüssig, den ein "keyPressEvent()" erhält auch immer ein "QKeyEvent" als Parameter.
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

Danke für den Hinweis aber du kannst davon ausgehen, dass ich die Doku gelesen habe, bevor ich hier poste, aber ich werde einfach nicht schlau daraus.

Vielleicht habe ich mich auch einfach zu ungenau ausgedrückt.

Ich bekomme ja für jeden Tastendruck über event.key() den Code für die jeweilige Taste geliefert, wie es in der Doku steht:
int QKeyEvent::key () const
Returns the code of the key that was pressed or released.

See Qt::Key for the list of keyboard codes. These codes are independent of the underlying window system. Note that this function does not distinguish between capital and non-capital letters, use the text() function (returning the Unicode text the key generated) for this purpose.
Ein Beispielsession sieht dann so aus:
Key Code: 65 unicode: a
Key Code: 66 unicode: b
Key Code: 67 unicode: c
Key Code: 16777248 unicode:
Key Code: 68 unicode: D
Key Code: 16777235 unicode:
Key Code: 16777237 unicode:
Key Code: 16777236 unicode:
Key Code: 16777234 unicode:
In der vierten Zeile wurde die Shifttaste gedrückt und die letzten vier Zeilen sind die Pfeiltasten.

In dem Programm, was ich als Basis verwendet habe und das auf gtk aufsetzt, sieht die gleiche Eingabe aber so aus:
a
b
c
Shift_L
D
ISO_Level3_Shift
Up
Down
Right
Left
Das sieht für mich danach aus, dass der Code direkt in lesbare Ausdrücke übersetzt wird. Nun war meine Frage, ob ich das unter Qt genauso einfach hinkriege?
BlackJack

@EmaNymton: In dem von Dir zitierten Teil der Doku steht `See Qt::Key for the list of keyboard codes.` Und in dem genannten ``enum`` sind doch Namen für die Konstanten. Die Zahl in der vierten Zeile Deiner Ausgabe findet sich zum Beispiel hier wieder:

Code: Alles auswählen

In [236]: QtCore.Qt.Key_Shift
Out[236]: 16777248
lunar

@EmaNymton: Oh Entschuldigung, ich dachte, es ginge Dir lediglich darum, zu prüfen, ob ein Tastaturereignis einer bestimmten Taste entspricht. Das hättest Du mit "QKeyEvent.key()" und "Qt.Key_*" oder mit "QKeyEvent.matches()" leicht hinbekommen, deswegen auch mein Hinweis auf die Dokumentation. :oops:

Diese "lesbaren Ausdrücke" sind die Bezeichnungen, die X11 den Tasten zuweist. Direkt über Qt kannst Du diese Bezeichnungen nicht ermitteln, da Qt per se plattformunabhängig ist und daher nicht immer Zugriff auf das darunter liegende Fenstersystem bietet. Allerdings bietet Qt über "QKeyEvent.nativeVirtualKey()" Zugriff auf das X11-Tastensymbol. Mittels ctypes kann man dann libX11 laden, um mit der Funktion "XKeysymToString()" die Bezeichnung dieses Symbols abzufragen.

Zur Wiedergutmachung habe ich Dir dafür ein Beispiel implementiert. Ich hoffe, Du verzeihst mir :)
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

lunar hat geschrieben:Ich hoffe, Du verzeihst mir :)
Ok, verziehen ;)

Und vielen Dank dafür, allerdings muss ich mir dann wohl erstmal ctypes zu Gemüte führen, damit ich das nachvollziehen kann.

P.S.: Warum der keyReleaseEvent oder ist der nur zu Demonstrationszwecken?

Edit: Hmmm, zu früh gefreut. Auf meinem Desktop-PC klappt es wunderbar, auf dem N900 bis auf die Pfeiltasten Left und Right auch. Gerade die brauch ich aber :/ Das scheint wohl mit dem Tastatur-Layout zusammenzuhängen, da die Pfeiltasten über ein weitere Taste in ihrer Funktion umgeschaltet werden.

Bild

Da werde ich mich wohl mal schlau machen müssen oder im Maemo-Forum fragen, es sein denn ihr habt noch einen Einfall.
lunar

Nur zu Demonstrationszwecken, halt ebenso wie das ganze Beispiel selbst ;) Im Bezug auf die Pfeiltasten kann ich Dir nicht helfen, ich glaube, in einem Maemo-Fragen wird man Dir wohl eher helfen können. Eine Alternative wäre auch ein Blick in den Quelltext des Maemo-Ports von Gtk, um herauszufinden, wie "gtk.gdk.keyval_name(event.keyval)" funktioniert.
EmaNymton
User
Beiträge: 174
Registriert: Sonntag 30. Mai 2010, 14:07

Ich bin erst jetzt mal wieder zum programmieren gekommen und habe das Problem mit den Pfeiltasten mittlerweile gelöst.

Das Problem bestand wohl darin, dass die Pfeiltasten die Auswahl der Knöpfe wechselten, doch es ist am N900 per default nicht zu erkennen, ob ein Element den Fokus hat oder nicht. Nach zufälligem Probieren fiel mir nämlich auch auf, dass die Leertaste den ersten Knopf auslöste.
Sobald ich im Qt-Designer die focusPolicy aller Knöpfe auf NoFocus stelle funktionieren auch die Pfeiltasten.

Das hat mich mal wieder wertvolle Stunden meines Lebens gekostet ;)

Eine Frage bleibt mir aber: Es sollte doch trotzdem ein Event ausgelöst werden, das Wechseln der Tasten ist doch nur eine Reaktion auf den Tastendruck?!
Das finde ich immer noch merkwürdig, vielleicht hat einer von den Experten ja eine plausible Antwort.

Danke lunar jedenfalls nochmal für deine Mühe!

Gruß EmaNymton
Antworten