5

ソフトウェアに問題があります。私のピアノ ソフトウェアでは、キーボードのキーを押し続けると、その特定のキーの同じトーンが複数繰り返されます。しかし、実際には、その特定のキーを離すまでに 1 つのトーンが必要です。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)
4

2 に答える 2

6

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)

さて、あなたが言ったように、これはキーが押されるたびにあなたの音を単に発射します。必要な機能全体を取得するには、いくつかの手順が必要です。

  1. 停止するように指示されるPlaynoteまでループを続けることができる必要があります
  2. Playnote後で停止するには、そのオブジェクトへの参照を保持する必要があります
  3. keyReleaseEventは、Playnote参照を使用して停止する必要があります

1)Playnoteループする必要があります

この機能にPhononを使用している場合は、ドキュメントで提案されてPlaynoteいるアプローチを使用できます。これは、メディアオブジェクトのシグナルを、同じメディアソースの別のバージョンをエンキューするメソッドに接続することです。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)Playnoteオブジェクトが必要

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はPlaynoteオブジェクトを停止します

サウンドを開始してループしたので、後で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
于 2012-04-06T19:19:11.617 に答える
6

event.isAutoRepeat()イベントがキーボードのオートリピートまたは実際のキー押下によって発生したかどうかを確認する必要があります。オートリピートの場合は、そのプレスを無視してください。

于 2012-04-06T18:52:32.527 に答える