2012-12-27 13 views
5

ten jest kontynuacją pytanie do tej odpowiedzi: https://stackoverflow.com/a/11939294/406686:rur wszystkie polecenia klawiatury automatycznie osadzonym przykład mplayer, gdy zostanie naciśnięty klawisz modyfikujący w PyQt4

Rozważmy następujący kod, który osadza MPlayer w QWidget. Problem polega na tym, że nie reaguje on na żadne skróty klawiszowe mplayera, takie jak strzałka w prawo, aby wyszukiwać dalej i tak dalej.

Jest oczywiste, że mogę ponownie wprowadzić każdy skrót ręcznie. Czy istnieje jednak sposób na automatyczne przekierowanie wszystkich sekwencji klawiszy do mplayera, o ile klawisz modyfikujący, np. ALT lub klawisz Win jest wciśnięty?

Na przykład: Naciśnij ALT + = dążyć naprzód ...

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_()) 

Odpowiedz

1

Nie jestem pewien, czy mam problem rację. Można łatwo dodać metody keyPressEvent i keyReleaseEvent do Window klasy:

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 

Ten przykład będzie działać tylko z modyfikatora + jedna inny klucz. Jeśli to potrzebne dla bardziej skomplikowanych skrótów, takich jak Alt + Ctrl + Przesunięcie + też, może być konieczne, aby zapisać listę aktualnie wciśnięte klawisze, ale podstawowa idea powinno być jasne.

Na moim komputerze wciśnięty klawisz pythonu i otrzymany z mplayera są różne, ale używam bardzo nietypowego układu klawiatury (Neo-Layout), więc może to być przyczyną tego.

+0

Dzięki, ale nie działa bez komunikatów o błędach. Jeśli wydrukuję coś przed linią 'self .__ modifier_pressed = True' zostanie wydrukowane, gdy klawisz modyfikatora zostanie naciśnięty, ale jeśli wydrukuję coś przed' self.mplayer.run_command ("key_down_event", klawisz) 'nic się nie dzieje, więc wydaje się, że część elifa nigdy nie zostanie wykonana ... – student

+0

Generalnie powinna działać, gdy przytrzymasz klawisz "Alt", a następnie naciskasz inny klawisz. Właśnie zdałem sobie sprawę, że istnieje ogólny problem z klawiszami strzałek. Jako obejście dodałem metodę self.setFocus() do metody init, a następnie wszystkie keyPressEvents zostaną aktywowane. –

+1

Właśnie się dowiedziałem, że event.nativeVirtualKey() może wysłać prawy klawisz do mplayera, niestety to nie działa dla klawiszy strzałek. Prawdopodobnie muszą zostać przekonwertowane ręcznie na kod klucza wymagany przez mplayer. –

Powiązane problemy