2012-12-27 25 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所需的关键代码。 –