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)
さて、あなたが言ったように、これはキーが押されるたびにあなたの音を単に発射します。必要な機能全体を取得するには、いくつかの手順が必要です。
- 停止するように指示される
Playnote
までループを続けることができる必要があります
Playnote
後で停止するには、そのオブジェクトへの参照を保持する必要があります
- 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