这是此答案的后续问题:https://stackoverflow.com/a/11939294/406686:

考虑以下代码,该代码将mplayer嵌入QWidget。问题在于,它对任何mplayer键盘快捷键均无 react ,例如,向前搜索的向右箭头等。

很明显,我可以手动重新实现每个快捷方式。但是,是否有一种方法可以将所有键盘序列自动通过管道传输到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_())

最佳答案

如果您的问题正确,我不确定。您可以轻松地将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

本示例仅适用于Modifier +其他键。如果还需要更复杂的快捷方式(例如Alt + Ctrl + Shift +→),则可能需要列表来保存当前按下的键,但是基本思路应该很清楚。

在我的计算机上,python的按下键与从mplayer接收到的键不同,但是我使用了一种非常不常见的键盘布局(Neo-Layout),因此这可能是原因。

关于python - 在pyqt4中按下修饰键时,会自动将所有键盘命令传递给嵌入式mplayer实例,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/14056163/

10-13 05:06