5

Вопрос по event-handling, python – Событие QKeyPress в PyQt

У меня проблемы с моим программным обеспечением. В моем программном обеспечении для пианино, если я продолжаю нажимать клавишу на клавиатуре, она воспроизводит несколько повторяющихся тонов одной и той же клавиши. Но на самом деле мне нужен один тон до выпуска этого конкретного ключа. Я предоставляю часть своего кода, которая обнаруживает событие keyPress и вызывает соответствующий метод. Так какие же изменения должны быть в моем коде?

def keyPressEvent(self, event):
    if type(event) == QtGui.QKeyEvent and event.key() == QtCore.Qt.Key_A : 
        self.Playnote('/home/hemanth/hemanth/Piano/C.mp3')
        self.ui.pushButton.animateClick(100)
    if type(event) == QtGui.QKeyEvent and event.key() == QtCore.Qt.Key_S:
        self.Playnote('/home/hemanth/hemanth/Piano/D.mp3')
        self.ui.pushButton_2.animateClick(100)
  • Error: User Rate Limit Exceeded

    от Hemanth Raveendran
  • Error: User Rate Limit Exceeded

    от
  • 6

    Вы должны проверить

    event.isAutoRepeat() чтобы определить, вызвано ли событие автоматическим повторением клавиатуры или фактическим нажатием клавиши. Если это автоповтор, игнорируйте это нажатие.

  • 5

    Поскольку keyPressEvent всегда будет получать QKeyEvent

    вам вообще не нужно проверять его тип. Вы уже можете начать с упрощения этого примера:

    def keyPressEvent(self, event):
        key = event.key()
        if key == QtCore.Qt.Key_A : 
            self.Playnote('/home/hemanth/hemanth/Piano/C.mp3')
            self.ui.pushButton.animateClick(100)
        elif key == QtCore.Qt.Key_S:
            self.Playnote('/home/hemanth/hemanth/Piano/D.mp3')
            self.ui.pushButton_2.animateClick(100)
    

    Теперь, как вы сказали, это будет просто запускать ваши звуки при каждом нажатии клавиши. Было бы несколько шагов, необходимых для получения всей необходимой вам функциональности.

    The Playnote needs to be able to keep looping until told to stop You need to keep a reference to that Playnote object in order to stop it later A keyReleaseEvent will have to use the Playnote reference to stop it 1) Playnote needs to loop

    Если вы используете Phonon для функциональности этогоPlaynoteтогда вы можете использоватьподход, предложенный документами, Это должно было бы соединить медиаобъекты & apos;aboutToFinish сигнал для метода, который будет ставить в очередь другую версию того же источника медиа.

    Это может выглядеть примерно так:

    class Playnote(QtCore.QObject):
    
        def __init__(self, soundFile, parent=None):
            super(Playnote, self).__init__(parent)
    
            self._isStopped = True
    
            self.mediaSource = Phonon.MediaSource(soundFile)
            self.mediaObject = Phonon.MediaObject(self)
            self.audioOutput = Phonon.AudioOutput(Phonon.MusicCategory, self)
            Phonon.createPath(self.mediaObject, self.audioOutput)
            self.mediaObject.setCurrentSource(self.mediaSource)
    
            self.mediaObject.aboutToFinish.connect(self.doRequeue)
    
    
        def doRequeue(self):
            if not self._isStopped:
                self.mediaObject.enqueue(self.mediaSource)
    
    
        def play(self):
            self._isStopped = True
            # other code here
    
        def stop(self):
            self._isStopped = False
            # other code here
    

    Вы подключаете этот сигнал к методу, который будет запрашивать тот же звук, если проигрыватель не был остановлен.

    2) Need a Playnote object

    Когда вы начнете свой звук с помощью keyPressEvent, вам нужно будет сохранить ссылку на объект, который сейчас воспроизводится. Может быть, вы можете создать словарь и сохранить сопоставление ключа с текущим игровым объектом?

    # in your class
    self.keysPlaying = {}
    
    def keyPressEvent(self, event):
        key = event.key()
        if key == QtCore.Qt.Key_A :
            c_note = Playnote('/home/hemanth/hemanth/Piano/C.mp3')
            self.keysPlaying['c'] = c_note
    
    3) keyReleaseEvent stops Playnote object

    Теперь, когда вы начали и зациклили свой звук, вы можете использовать ссылку, чтобы остановить ее позже в keyReleaseEvent:

    def keyReleaseEvent(self, event):
        key = event.key()
        if key == QtCore.Qt.Key_A :
            note = self.keysPlaying.get('c', None)
            if note:
                note.stop()
                self.keysPlaying['c'] = None