2012-12-27 11 views
5

Dies ist eine Frage zu dieser Antwort folgen ist: https://stackoverflow.com/a/11939294/406686:Rohr alle Tastatur automatisch zu einem eingebetteten Mplayer Beispiel Befehle, wenn eine Zusatztaste in PyQt4 gedrückt wird

Betrachten Sie den folgenden Code, der MPlayer in einem QWidget einbettet. Das Problem ist, dass es auf keine mplayer-Tastaturkürzel wie den rechten Pfeil zum Suchen usw. reagiert.

Es ist klar, dass ich jede Verknüpfung manuell neu implementieren kann. Aber gibt es eine Möglichkeit, alle Tastatursequenzen automatisch an mplayer zu übertragen, solange eine Modifikatortaste gedrückt wird, zB ALT oder Win-Key?

Zum Beispiel: Drücken Sie ALT + = vorwärts suchen ...

import mpylayer 
from PyQt4 import QtGui, QtCore 

class Window(QtGui.QWidget): 
    def __init__(self): 
     QtGui.QWidget.__init__(self) 
     self.container = QtGui.QWidget(self) 
     self.container.setStyleSheet('background: black') 
     self.button = QtGui.QPushButton('Open', self) 
     self.button.clicked.connect(self.handleButton) 
     layout = QtGui.QVBoxLayout(self) 
     layout.addWidget(self.container) 
     layout.addWidget(self.button) 
     self.mplayer = mpylayer.MPlayerControl(
      'mplayer', ['-wid', str(self.container.winId())]) 

    def handleButton(self): 
     path = QtGui.QFileDialog.getOpenFileName() 
     if not path.isEmpty(): 
      self.mplayer.loadfile(unicode(path)) 

if __name__ == '__main__': 

    import sys 
    app = QtGui.QApplication(sys.argv) 
    window = Window() 
    window.resize(640, 480) 
    window.show() 
    sys.exit(app.exec_()) 

Antwort

1

Ich bin nicht sicher, ob ich Recht Problem. Sie könnten die keyPressEvent und keyReleaseEvent Methoden zu Ihrer Window Klasse leicht hinzufügen:

class Window(QtGui.QWidget): 
    def __init__(self): 
     # same code as above 
     self.setFocus() 
     self.__modifier_pressed = False 

    def keyPressEvent(self, event): 
     if event.key() == QtCore.Qt.Key_Alt: 
      self.__modifier_pressed = True 
     elif self.__modifier_pressed: 
      self.mplayer.run_command("key_down_event", event.nativeVirtualKey()) 

    def keyReleaseEvent(self, event): 
     if event.key() == QtCore.Qt.Key_Alt: 
      self.__modifier_pressed = False 

Dieses Beispiel würde nur mit Modifier + ONE anderen Schlüsseln arbeiten. Wenn Sie auch für komplexere Verknüpfungen müssen diese, wie Alt + Ctrl +Umschalt +, können Sie Listen müssen die aktuell gedrückte Tasten speichern, aber die Grundidee sollte klar sein.

Auf meinem Computer sind die gedrückte Taste von Python und die empfangene von MPlayer unterschiedlich, aber ich verwende ein sehr ungewöhnliches Tastaturlayout (Neo-Layout), also könnte dies der Grund dafür sein.

+0

Danke, aber es funktioniert nicht ohne Fehlermeldungen. Wenn ich etwas vor der Zeile 'self .__ modifier_pressed = True 'drucke, wird es ausgedruckt, wenn die Modifikatortaste gedrückt wird, aber wenn ich etwas vor' self.mplayer.run_command (" key_down_event ", key) drucke, passiert nichts es scheint, dass der elif part niemals ausgeführt wird ... – student

+0

Im Allgemeinen sollte es funktionieren, wenn man die "Alt" -Taste gedrückt hält und dann eine andere Taste drückt. Ich habe gerade festgestellt, dass es ein generelles Problem mit den Pfeiltasten gibt. Als Workaround habe ich der init-Methode self.setFocus() hinzugefügt, dann werden alle keyPressEvents aktiviert. –

+1

Ich habe gerade herausgefunden, dass event.nativeVirtualKey() den richtigen Schlüssel an mplayer senden kann, leider funktioniert das nicht für Pfeiltasten. Wahrscheinlich müssen sie manuell in den von mplayer benötigten Schlüsselcode konvertiert werden. –