5

これは、この回答に対するフォローアップの質問です:https ://stackoverflow.com/a/11939294/406686 :

mplayerをに埋め込む次のコードについて考えてみますQWidget。問題は、前方にシークするための右矢印などのmplayerキーボードショートカットに反応しないことです。

すべてのショートカットを手動で再実装できることは明らかです。ただし、修飾キー、たとえばALTまたはWin-Keyが押されている限り、すべてのキーボードシーケンスをmplayerに自動的にパイプする方法はありますか?

ALT例: +を押します→</kbd> = seek forward...

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

1 に答える 1

1

問題が解決したかどうかはわかりません。keyPressEventおよびkeyReleaseEventメソッドを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

この例は、修飾子 + 1 つのその他のキーでのみ機能します。Alt+ Ctrl+ Shift+などのより複雑なショートカットにもこれが必要な場合は、現在押されているキーを保存するためのリストが必要になる場合がありますが、基本的な考え方は明らかです。

私のパソコンでは、python の押されたキーと mplayer から受け取ったキーは異なりますが、非常に珍しいキーボード レイアウト ( Neo-Layout ) を使用しているため、これが原因である可能性があります。

于 2013-01-24T11:06:10.000 に答える