Автоматически передавать все команды клавиатуры во встроенный экземпляр mplayer при нажатии клавиши-модификатора в pyqt4.

Это дополнительный вопрос к этому ответу: https://stackoverflow.com/a/11939294/406686:

Рассмотрим следующий код, встраивающий 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_())

person student    schedule 27.12.2012    source источник


Ответы (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

Этот пример будет работать только с модификатором + ОДНА другая клавиша. Если вам также нужно это для более сложных сочетаний клавиш, таких как Alt+Ctrl+Shift+, вы можете нужны списки для сохранения нажатых в данный момент клавиш, но основная идея должна быть ясна.

На моем компьютере нажатая клавиша python и полученная от mplayer отличаются, но я использую очень необычную раскладку клавиатуры (Neo-Layout), так что это может быть причиной этого.

person Sebastian Werk    schedule 24.01.2013
comment
Спасибо, но это не работает без сообщений об ошибках. Если я печатаю что-то перед строкой self.__modifier_pressed = True, оно распечатывается при нажатии клавиши модификатора, но если я печатаю что-то до self.mplayer.run_command("key_down_event", key), ничего не происходит, поэтому кажется, что часть elif никогда не выполняется... - person student; 25.01.2013
comment
В общем, это должно работать, удерживая клавишу «Alt», а затем нажимая другую клавишу. Я только что понял, что есть общая проблема со стрелками. В качестве обходного пути я добавил self.setFocus() в метод инициализации, после чего активируются все события keyPressEvents. - person Sebastian Werk; 25.01.2013
comment
Я только что узнал, что event.nativeVirtualKey() может отправить правильную клавишу в mplayer, к сожалению, это не работает для клавиш со стрелками. Вероятно, их нужно конвертировать вручную в ключевой код, требуемый mplayer. - person Sebastian Werk; 25.01.2013
comment
Спасибо, это работает, кроме клавиш со стрелками и пробела (что было бы важно). Было бы здорово, если бы у вас была идея, как это решить. Тем не менее, я даю вам бонусные очки! - person student; 25.01.2013