Hem*_*ran 5 python qt pyqt event-handling piano
我的软件有问题.在我的钢琴软件中,如果我一直按下键盘上的一个键,那么它会使该特定键重复多次相同的音调.但实际上我需要一个单一的音调,直到该特定键的释放.我提供了一部分代码来检测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)
Run Code Online (Sandbox Code Playgroud)
由于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)
Run Code Online (Sandbox Code Playgroud)
现在,就像你说的那样,每按一次键就会发出声音.需要几个步骤才能获得所需的全部功能.
Playnote需要能够保持循环,直到被告知停止Playnote对象的引用,以便以后停止它Playnote引用来阻止它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
Run Code Online (Sandbox Code Playgroud)
您正在将该信号连接到一个方法,如果播放器尚未停止,该方法将重新排列相同的声音.
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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)