2012-12-27 54 views
5

這是這個答案的後續問題被按下鍵盤的所有自動命令嵌入MPlayer的實例:https://stackoverflow.com/a/11939294/406686管道時修改鍵PyQt4中

考慮下面的代碼,其中嵌入的mplayer在QWidget。問題在於它不會對任何mplayer鍵盤快捷鍵(例如向前查找的右箭頭等)作出反應。

很明顯,我可以手動重新實現每個快捷方式。但是有沒有辦法將所有的鍵盤序列自動傳輸到mplayer,只要按下ALT或Win-Key鍵等修飾鍵?

例如:按ALT +=向前搜索...

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

回答

1

我不知道,如果我得到你的問題所在。你可以很容易的keyPressEventkeyReleaseEvent方法添加到您的Window類:

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 

這個例子只用修改器+ ONE等重點工作。如果你還需要這對於更復雜的快捷鍵,如Alt鍵 + 按Ctrl ++,您可能需要列出保存當前按鍵,但基本的思路應該是清楚的。

在我的電腦上,python的按鍵和從mplayer收到的不同,但我使用了非常不尋常的鍵盤佈局(Neo-Layout),所以這可能是這個原因。

+0

謝謝,但它沒有錯誤信息不起作用。如果我在「self .__ modifier_pressed = True」行之前打印某些內容,當按下修飾鍵時會打印出來,但如果我在'self.mplayer.run_command(「key_down_event」,key)之前打印了什麼,似乎elif部分從來沒有得到執行... – student

+0

一般來說,它應該在按住「Alt」鍵然後按另一個鍵時工作。我剛剛意識到,箭頭鍵存在一個普遍問題。作爲一種解決方法,我將self.setFocus()添加到init方法中,然後激活所有keyPressEvents。 –

+1

我剛剛發現,event.nativeVirtualKey()可能會將正確的鍵發送到mplayer,不幸的是這不適用於箭頭鍵。可能他們需要手動轉換爲mplayer所需的關鍵代碼。 –