python - 当在 pyqt4 中按下修改键时,将所有键盘命令自动传输到嵌入式 mplayer 实例

标签 python keyboard qt4 pyqt4 mplayer

这是此答案的后续问题: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+ONE other 键。如果你还需要这个更复杂的快捷键,比如 Alt+Ctrl+Shift+,你可能需要列表来保存当前按下的键,但基本思路应该很清楚。

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

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

相关文章:

python - GitPython 如何克隆所有分支?

iphone - IOS - 如何避免键盘在 uiwebview 重新加载时隐藏

c++ - 通过 getter 获取时在其他类中声明结构变量

c++ - map 数组帮助c++/qt

objective-c - 如何从虚拟键盘 IOS 中删除上一个下一个按钮

php - 客户端/服务器通信的最佳协议(protocol),从 PHP/Perl 到 C++/Qt4

python - 限制终端服务器下应用程序实例数量的技术

python - 我应该在 PyPI 发布的包中测试不受支持的 Django 版本吗?

python - 如何摆脱混淆矩阵中的白线?

android - Webview html输入表单不显示/不允许键盘