【问题标题】:Pipe all keyboard commands automatically to an embedded mplayer instance when a modifier key is pressed in pyqt4当在 pyqt4 中按下修饰键时,将所有键盘命令自动通过管道传输到嵌入式 mplayer 实例
【发布时间】:2012-12-27 14:22:32
【问题描述】:

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

考虑以下代码,它将 mplayer 嵌入到 QWidget 中。问题是它不会对任何 mplayer 键盘快捷键做出反应,例如用于向前搜索的右箭头等。

很明显,我可以手动重新实现每个快捷方式。但是,只要按下修饰键,例如 ALT 或 Win-Key,有没有办法将所有键盘序列自动传送到 mplayer?

例如:按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_())

【问题讨论】:

    标签: python keyboard qt4 pyqt4 mplayer


    【解决方案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+Shift+,您可以需要列表来保存当前按下的按键,但基本思路要清楚。

    在我的电脑上,python的按键和mplayer收到的按键不一样,但是我使用了一种非常不常见的键盘布局(Neo-Layout),所以可能是这个原因。

    【讨论】:

    • 谢谢,但如果没有错误消息,它就无法工作。如果我在self.__modifier_pressed = True 行之前打印一些东西,当按下修饰键时,它会被打印出来,但是如果我在self.mplayer.run_command("key_down_event", key) 之前打印一些东西,什么都不会发生,所以似乎 elif 部分永远不会被执行......
    • 一般来说它应该在按住“Alt”键然后按另一个键时工作。我刚刚意识到,箭头键存在一般问题。作为一种解决方法,我将 self.setFocus() 添加到 init 方法中,然后激活所有 keyPressEvents。
    • 我刚刚发现,event.nativeVirtualKey() 可能会向 mplayer 发送右键,不幸的是这不适用于箭头键。可能,他们需要手动转换为 mplayer 所需的关键代码。
    • 谢谢,除了箭头键和空格(这很重要)外,这有效。如果您知道如何解决这个问题,那就太好了。不过我给你赏金!
    猜你喜欢
    • 1970-01-01
    • 2018-08-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多